在回答我的另一个答案的评论时 这里, ,我找到了我所想的 可能 是 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 的人对此有答案吗?

有帮助吗?

解决方案

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

C 标准的相关部分如下:

3.6 术语、定义和符号

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

注 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 type 相当于一个字节。

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

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

“size_t sz”的单位不是与您的架构的可寻址单元相同吗?我使用的 DSP 的地址对应于 32 位值,而不是字节。malloc(1) 获取一个指向 4 字节区域的指针。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top