我尝试在我正在处理的代码中使用realloc
,一旦我执行了realloc,并不是原始数组中的所有值都存在于新分配的数组中。代码如下。
#include <stdio.h>
#include <stdlib.h>
#define CONST1 20
#define CONST2 2
int main() {
double *a = (double *) malloc(sizeof(double) * CONST1);
int i;
for (i = 0; i < CONST1; i++) {
a[i] = i * i;
}
for (i = 0; i < CONST1; i++) {
printf("%.0lf ", a[i]);
}
printf("\n");
double *b = (double *) realloc(a, CONST1 + CONST2);
a[CONST1] = 11;
a[CONST1+1] = 12;
for (i = 0; i < CONST1+CONST2; i++) {
printf("%.0lf ", b[i]);
}
printf("\n");
return 0;
}
我运行此代码的输出是;
0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361
0 1 4 0 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 11 12
有人可以向我指出第二行中第二个0
的原因吗?
当CONST1
值设置为4
时,它可以正常工作。在4
之后,它会显示此行为,其中一个或两个值都设置为0
。
答案 0 :(得分:3)
假设double
长度为8个字节,我猜b
发生与a
相同,并写入了一些0x00
个字节在新分配的缓冲区之后对缓冲区进行管理。
你犯了两个错误:
a
的{{1}}已取消分配,因此您不得使用它。您已将新指针指定为realloc()
,因此请使用b
。b
的尺寸应为realloc()
,而不是sizeof(double) * (CONST1 + CONST2)
。此外,应释放分配的内容,因此您应在CONST1 + CONST2
之前添加free(b);
。