C标准malloc’ing字符的潜在问题

当我在这里回答对我的另一个答案的评论时,我发现我认为可能是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个char (10个字节),因为如果char为16位,则该体系结构/实现将字节定义为16位。 char不是八位字节,它是一个字节。 在较旧的计算机上,这可能比我们今天的8位事实标准更大。

C标准的相关部分如下:

3.6术语,定义和符号

byte – 可寻址的数据存储单元,足以容纳执行环境的基本字符集的任何成员…

注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类型等同于字节。

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

请注意,IETF RFC和标准通常(总是?)使用术语’octect’而不是’byte’来明确他们所谈论的单位恰好有8位 – 不多也不少。

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