【发布时间】:2018-04-14 11:53:47
【问题描述】:
我认为realloc() 函数会重新分配内存并且不会更改它。
在调试了一个我必须做的任务后,我意识到 realloc() 改变了内存中的一些元素并产生了错误。
于是我写了如下代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *a, *p;
a = (int*)calloc(10, sizeof(int));
for (int i = 0;i < 10; i++)
a[i] = i;
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
p = realloc(a, 20);
p[10] = 10;
for (int i = 0; i < 11; i++)
printf("%d ", p[i]);
printf("\n");
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
我得到以下输出
谁能解释为什么会发生这种情况?
我尝试使用malloc() 而不是calloc(),但现有数组也会改变。
【问题讨论】:
-
为
realloc()指定的新大小以字节为单位。如果你想为 20 个int提供新的存储空间,你需要做p = realloc(a, 20*sizeof(int))。如果sizeof(int)为 4,realloc(a, 20)将调整大小为五个int的数组,并且访问元素5到20会给出未定义的行为。 -
您还应该检查
calloc()和realloc()调用是否成功。如果失败,他们会返回NULL。
标签: c pointers dynamic-memory-allocation realloc