7

当在这里回答我的另一个答案的评论时,我发现我认为可能是 C 标准中的一个漏洞(c1x,我没有检查过早期的标准,是的,我知道我独自一人在所有星球的居民在标准中发现了一个错误)。信息如下:

  1. 第 6.5.3.4 节(“sizeof 运算符”)第 2 段状态"The sizeof operator yields the size (in bytes) of its operand"
  2. 该节第 3 段规定:"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1".
  3. 第 7.20.3.3 节描述void *malloc(size_t sz)但它所说的只是"The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate". 它根本没有提到参数使用什么单位。
  4. 附件 E 开头的 8 是最小值CHAR_BIT因此字符的长度可以超过一个字节。

我的问题很简单:

在一个 char 为 16 位宽的环境中,将malloc(10 * sizeof(char))分配 10 个字符(20 个字节)还是 10 个字节?上面的第1点似乎表示前者,第2点表示后者。

任何比我拥有更多 C-standard-fu 的人对此有答案吗?

4

3 回答 3

16

在 16 位char环境malloc(10 * sizeof(char))中将分配 10 chars(10 字节),因为如果char是 16 位,那么该架构/实现将一个字节定义为 16 位。Achar不是八位字节,它是一个字节。在较旧的计算机上,这可能大于我们今天拥有的 8 位实际标准。

C标准的相关部分如下:

3.6 术语、定义和符号

字节 - 数据存储的可寻址单元,大到足以容纳执行环境的基本字符集的任何成员......

注 2 - 一个字节由连续的比特序列组成,其数量由实现定义。

于 2009-10-08T01:38:24.310 回答
2

在 C99 标准中,字节、char和对象大小之间的严格相关性在 6.2.6.1/4“类型表示 - 常规”中给出:

存储在任何其他对象类型的非位域对象中的值由n × CHAR_BIT位组成,其中n是该类型对象的大小,以字节为单位。该值可以被复制到一个类型的对象中unsigned char [n](例如,通过 memcpy);结果的字节集称为值的对象表示。

在 C++ 标准中,相同的关系在 3.9/2“类型”中给出:

对于 POD 类型 T 的任何对象(基类子对象除外),无论该对象是否拥有 T 类型的有效值,构成该对象的底层字节 (1.7) 都可以复制到 char 或 unsigned 数组中字符。如果 char 或 unsigned char 数组的内容被复制回对象,则该对象随后应保持其原始值。

在 C90 中似乎没有明确提到的相关性,但是在字节的定义、字符的定义和sizeof运算符的定义之间可以推断出一个char类型等同于一个字节。

另请注意,字节中的位数(以及 a 中的位数char)是实现定义的——严格来说,它不需要是 8 位。onebyone 在其他地方的评论中指出,DSP 通常具有位数不是 8 的字节。

请注意,IETF RFC 和标准通常(总是?)使用术语“八进制”而不是“字节”来明确表示他们所谈论的单位正好有 8 位 - 不多也不少。

于 2009-10-08T15:27:32.377 回答
1

无论您的体系结构的可寻址单元是什么,“size_t sz”的单位都不是吗?我使用的 DSP 的地址对应于 32 位值,而不是字节。malloc(1) 给我一个指向 4 字节区域的指针。

于 2009-10-08T01:41:52.743 回答