realloc会对旧指针做什么

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)

指针仍指向同一地址,但内容已更改.

Cal*_*leb 6

指针仍指向同一地址,但内容已更改.

那是因为realloc()可能首先尝试增加a指向的块的大小.但是,它可以改为分配一个新块,将数据(或尽可能多的数据)复制到新块,并释放旧块.你真的不应该a在调用b = realloc(a, 200000 * sizeof(int))之后使用,因为realloc调用可能会将块移动到新位置,从而a指向不再分配的内存.请b改用.


Kei*_*son 6

返回的值realloc告诉您它是成功还是失败。

b = realloc(a, 200000 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

如果失败,则返回一个空指针,并且a仍然指向原始未修改的内存块(当然b是一个空指针)。

如果成功,则b指向一块(可能是新分配的)内存,并且 的值a不确定的。如果它能够在与旧块相同的位置分配新块(通过在适当的位置增加或缩小块),则将b等于a- 但测试它,甚至引用 的值a,具有未定义的行为。如果必须重新定位块,那么realloc将完成free(a)与复制数据后相同的操作。在任何一种情况下,最好设置aNULL以避免意外引用其(现在不确定)值。

请注意,realloc即使新大小较小,也可以重新定位块。