首页 > 解决方案 > malloc'ed 块是否允许指针算术?

问题描述

我正在阅读 C 标准中的以下内容:

(6.5.6 加法运算符)

9 当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。

现在我想知道什么被认为是“数组对象”。更具体地说,我想知道以下愚蠢的例子是否合法?分配的内存块是否被视为一个“数组对象”?

uint8_t *data = malloc(255);
uint8_t *end = data + 255;
ptrdiff_t size = end - data;

标签: cpointerslanguage-lawyerpointer-arithmetic

解决方案


我在标准中找不到任何充分定义“数组对象”的确切组成部分的内容,但是查看 C11 标准草案 7.22.3 中的内存分配函数,我确实发现了这一点:

连续调用对齐的 alloccallocmallocrealloc 函数分配的存储顺序和连续性是未指定的。如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。

它并不像人们想要的那样明确,但它确实表明从这些函数返回的内存可以用作数组,因此应该应用指针算法的规则。


推荐阅读