代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

C标准malloc'ing chars的潜在问题

  •  7
  • paxdiablo  · 技术社区  · 16 年前

    当对我的另一个回答回答评论时 here 我发现了我的想法 可以 作为一个C标准的漏洞(c1x,我没有检查过早期的标准,是的,我知道这是难以置信的不太可能,只有我在所有行星的居民中发现了一个标准的漏洞)。信息如下:

    1. 第6.5.3.4条(“sizeof operator”)第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位的环境中,will malloc(10 * sizeof(char)) 分配10个字符(20字节)还是10个字节?上述第1点似乎表示前者,第2点表示后者。

    有谁能比我更懂C-标准-fu的答案吗?

    3 回复  |  直到 13 年前
        1
  •  16
  •   paxdiablo    13 年前

    在16位 char 环境 malloc(10 * sizeof(char)) 将分配10个 烧焦 s(10字节),因为如果 烧焦 是16位,那么该体系结构/实现将一个字节定义为16位。一 烧焦 不是八位字节,而是字节。在旧的计算机上,这可以大于8位 事实上的 我们今天的标准。

    C标准的相关章节如下:

    3.6术语、定义和符号

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

    注2—字节由一个连续的位序列组成,其数目由实现定义。

        2
  •  2
  •   Michael Burr    15 年前

    在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或无符号char数组中。如果char或unsigned char数组的内容被复制回对象中,则对象随后应保留其原始值。

    在C90中,似乎没有明确提到的相关性,而是在字节定义、字符定义和 sizeof 算符可以推断出 烧焦 类型等效于字节。

    还要注意一个字节中的位数(以及 烧焦 )是否严格定义了实现,它不需要是8位。OneByone在其他地方的一条评论中指出,DSP通常有字节,字节的位数不是8。

    请注意,IETF RFC和标准通常(总是?)用“octect”这个词而不是“byte”来明确表示,他们所说的单位正好有8位——不多不少。

        3
  •  1
  •   twon33    16 年前

    “大小”的单位不是在您的体系结构的可寻址单位中吗?我使用的是一个地址对应32位值而不是字节的DSP。malloc(1)给我一个指向4字节区域的指针。