realloc() 是否使所有指针无效?

Does realloc() invalidate all pointers?

注意,这个问题不是问 realloc() 是否使原始块中的指针无效,而是询问它是否使所有其他指针无效。

我对 realloc() 的性质有点困惑,特别是它是否移动了任何其他内存。

例如:

void* ptr1 = malloc(2);
void* ptr2 = malloc(2);
....
ptr1 = realloc(ptr1, 3);

在此之后,我可以保证 ptr2 指向与 realloc() 调用之前相同的数据吗?

After this, can I guarantee that ptr2 points to the same data it did before the realloc() call?

是的。 realloc 不会影响您所做的其他 pointers/memory 分配。

注意realloc的方法:

ptr = realloc(ptr, ...);
如果 realloc 失败,

是不安全的。参见 Does realloc overwrite old contents?

ptr2 不受 ptr1.

的重新分配影响

是的,ptr2 不受 realloc() 的影响,它与 realloc() 调用没有任何关系(根据当前代码)。

但是,FWIW,根据 realloc()man page,(强调我的)

The realloc() function returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr,

ptr1 可能会被更改。

也就是说,

 ptr1 = realloc(ptr1, 3);

风格很危险。如果 realloc() 失败,

The realloc() function returns .... or NULL if the request fails

If realloc() fails the original block is left untouched; it is not freed or moved.

但是,根据您的陈述,在失败的情况下,NULL return 将覆盖实际内存,丢失实际内存并造成内存泄漏。

如果内存可用,则堆 realloc 会分配它。 如果不是,它就像 malloc 一个新大小的块,它在那里 memcpy 你的内容。