gpt4 book ai didi

c - 为什么必须为 realloc 分配一个指针才能在不更改内存块中的第一个值的情况下工作?

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:21 25 4
gpt4 key购买 nike

int *ptr;
...
realloc(ptr,++count*sizeof(int));
or
ptr=realloc(ptr,++count*sizeof(int));

我注意到如果我不止一次使用第一个选项,第一个内存地址的值(ptr 指向)将变为未定义(尽管内存块中的所有其他值都很好并且可以通过下标访问ptr)。

但是,我假设所有 realloc 所做的只是缩小或增加内存块的大小,并且 ptr 仍将指向同一内存块,并且其值都不会改变。所以如果我使用第一个选项,为什么内存块中的第一个地址最终会得到一个意外的值,因为 ptr 仍然指向相同的地址?

编辑:我确实记得为 ptr 分配内存,只是认为它不起作用。

最佳答案

realloc 返回的指针可能会也可能不会指向与您传递给它的指针相同的地址。

通常,如果您要扩展内存块,可能没有足够的空间将其扩展到位。在这种情况下,realloc 分配一个新的内存块,将旧对象的内容复制到新分配的 block 中,并返回指向新 block 的指针。如果您不将结果分配给指针对象,那么您就失去了它(旧 block 已被释放,您不知道新 block 在哪里)。

realloc 如果它收缩分配的 block ,甚至可以返回指向新分配的内存块的指针。可能有充分的理由从不同的内存区域分配较小的 block 。

您还需要注意 realloc 可能会失败。如果是,它返回一个空指针——并且旧指针仍然有效(只是没有指向你想要的大小的内存块)。 (原则上,即使新大小小于旧大小,realloc 也可能会失败。)因此,除非您对分配失败的响应是中止程序,或者至少中止其中使用的部分指针,您应该将结果分配给一个不同的指针对象:

int *ptr = ...;
int *new_ptr;
new_ptr = realloc(ptr, new_size);
if (new_ptr == NULL) {
/* ptr still points to the old block of memory; you can try something else */
}
else {
ptr = new_ptr; /* Now you can forget the old pointer value */
}

如果realloc成功,它返回的指针值是有效的,而你传递给它的指针是无效的。

如果realloc失败,它返回一个空指针,你传递给它的指针仍然有效。

关于c - 为什么必须为 realloc 分配一个指针才能在不更改内存块中的第一个值的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25435072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com