c - realloc 将对旧指针做什么

标签 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);
}

输出是

11111
0x2558010
00111
1111100000
0x2558010 0x7f29627e6010

指针a还是指向同一个地址,只是内容变了。

最佳答案

Pointer a still point to the same address, but the content is changed.

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

关于c - realloc 将对旧指针做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36923389/

相关文章:

c - 尝试读取隐藏文件 linux 时出现段错误

c - 为什么 realloc 在此 while 循环中不起作用?

c - 如何覆盖C中的字符串的一部分?

c - 从 C 使用 WinRT?

C++:原始指针的容器

c++ - 如何将指针的元素更改为 vector ?

c - 如何在 C 语言中为特定的结构类型正确使用 free

c++ - 用strtok拼接cstrings,只适用于循环的第一次执行

使用正则表达式 c 检查 url

c - 将相同的结构成员分配给其他成员时,c 中的分配类型不兼容