int a[5], *p = a+5, diff = p-a; // Well-defined
然而,这些是未定义行为:
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?
new
是一个不同的东西。它不仅仅是内存分配。此外,C++语言专家会说,仅仅写入由malloc返回的内存并不会在那里创建一个对象,更不用说使内存具有有效类型了。 - StoryTeller - Unslander Monicaa + 6
相同。 - StoryTeller - Unslander Monicaaligned_alloc
、calloc
、malloc
和realloc
函数所分配的存储空间的顺序和连续性是未指定的。如果分配成功,则返回的指针适当地对齐,以便将其分配给任何具有基本对齐要求的对象类型的指针,然后用于访问在分配的空间中分配的此类对象或此类对象的数组(直到显式释放该空间)。 它说“这样的对象数组”——对于数组来说是可以的;因此在这里也是可以的。 - Jonathan Leffler