【发布时间】:2018-06-02 16:26:24
【问题描述】:
在 C 中,创建一个指向数组最后一个元素之后的指针并在指针算术中使用它是非常好的,只要你不取消引用它:
int a[5], *p = a+5, diff = p-a; // Well-defined
但是,这些是 UB:
p = a+6;
int b = *(a+5), diff = p-a; // Dereferencing and pointer arithmetic
现在我有一个问题:这是否适用于动态分配的内存?假设我只在指针算术中使用指向过去最后一个的指针,而不取消引用它,并且malloc() 成功。
int *a = malloc(5 * sizeof(*a));
assert(a != NULL, "Memory allocation failed");
// Question:
int *p = a+5;
int diff = p-a; // Use in pointer arithmetic?
【问题讨论】:
-
好吧,你标记了 C。而 C++ 的
new是一个不同的野兽。它不仅仅是内存分配。另外,C++ 语言律师会说,仅仅写入 malloc 返回的内存并不会在那里创建对象,更不用说使内存具有有效的类型了。 -
你实际上可以有一个指向 anywhere 的指针,只要你不取消引用它。您甚至可以使用它与其他指针进行比较,即使它可能没有意义。
-
@Someprogrammerdude 这太疯狂了。那不是UB吗?
-
@Someprogrammerdude - 但我认为您无法以任何方式获得指向任何地方的指针。例如,您不能像 iBug 指出的那样进行指针运算。那就是UB本身。您可以将整数常量转换为指针,但不能保证它与
a + 6的地址相同。 -
ISO/IEC 9899:2011 §7.22.3 内存管理功能 ¶1 连续调用
aligned_alloc,@分配的存储顺序和连续性987654328@、malloc和realloc函数未指定。如果分配成功,则返回的指针经过适当对齐,以便可以将其分配给具有基本对齐要求的任何类型对象的指针,然后用于访问分配的空间中的此类对象或此类对象的数组(直到空间被显式释放)。 它说“这样的对象的数组”——对于数组来说没问题;所以这里没问题。
标签: c malloc language-lawyer bounds dynamic-allocation