我尝试在我正在处理的代码中使用 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
的行为。
最佳答案
假设 double
是 8 字节长,我猜 b
happened 与 a
相同并且在新分配的缓冲区之后,一些 0x00
字节被写入缓冲区以管理一些东西。
你犯了两个错误:
- 传递给
realloc()
的a
被释放,根据N1256 7.20.3.4 realloc 函数,所以你不能使用它。您已将新指针分配给b
,因此请使用b
。 - 要传递给
realloc()
的大小应该是sizeof(double) * (CONST1 + CONST2)
,而不是CONST1 + CONST2
.
此外,分配的任何内容都应该被释放,因此您应该在 return 0;
之前添加 free(b);
。
关于c - realloc 不提供旧数组中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35882682/