C 标准 malloc 字符的潜在问题
题
在回答我的另一个答案的评论时 这里, ,我找到了我所想的 可能 是 C 标准中的一个漏洞(c1x,我没有检查过早期的标准,是的,我知道在这个星球上的所有居民中,只有我一个人发现了标准中的错误,这是难以置信的)。信息如下:
- 第 6.5.3.4 节(“sizeof 运算符”)第 2 段指出
"The sizeof operator yields the size (in bytes) of its operand"
. - 该节第 3 段规定:
"When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1"
. - 第 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"
. 。它根本没有提及参数使用什么单位。 - 附件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
s(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 字节区域的指针。