Shu*_* Xu 1 c pointers realloc
我有一个关于realloc函数的问题.应用realloc函数后,是否会更改旧指针的内容?代码是
main () {
int *a, *b, i;
a = calloc(5, sizeof(int));
for (i = 0; i < 5; i++)
a[i] = 1;
for (i = 0; i < 5; i++)
printf("%d", a[i]);
printf("\n%p\n", a);
b = realloc(a, 200000 * sizeof(int));
if(b == NULL)
printf("error\n");
for (i = 0; i < 5; i++)
printf("%d", a[i]);
printf("\n");
for (i = 0; i < 10; i++)
printf("%d", b[i]);
printf("\n%p %p\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)
输出是
11111
0x2558010
00111
1111100000
0x2558010 0x7f29627e6010
Run Code Online (Sandbox Code Playgroud)
指针仍指向同一地址,但内容已更改.
指针仍指向同一地址,但内容已更改.
那是因为realloc()可能首先尝试增加a指向的块的大小.但是,它可以改为分配一个新块,将数据(或尽可能多的数据)复制到新块,并释放旧块.你真的不应该a在调用b = realloc(a, 200000 * sizeof(int))之后使用,因为realloc调用可能会将块移动到新位置,从而a指向不再分配的内存.请b改用.
返回的值realloc告诉您它是成功还是失败。
b = realloc(a, 200000 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果失败,则返回一个空指针,并且a仍然指向原始未修改的内存块(当然b是一个空指针)。
如果成功,则b指向一块(可能是新分配的)内存,并且 的值a是不确定的。如果它能够在与旧块相同的位置分配新块(通过在适当的位置增加或缩小块),则将b等于a- 但测试它,甚至引用 的值a,具有未定义的行为。如果必须重新定位块,那么realloc将完成free(a)与复制数据后相同的操作。在任何一种情况下,最好设置a为NULL以避免意外引用其(现在不确定)值。
请注意,realloc即使新大小较小,也可以重新定位块。
| 归档时间: |
|
| 查看次数: |
3032 次 |
| 最近记录: |