realloc 不提供旧数组中的所有值
realloc does not provide all the values that were there in the old array
我尝试在我正在处理的代码中使用 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
碰巧 与 a
和某些 [=13] 相同=] 字节写入新分配的缓冲区之后的缓冲区来管理一些东西。
你犯了两个错误:
- 传递给
realloc()
的a
被释放,根据N12567.20.3.4的realloc函数,所以一定不要使用。您将新指针分配给 b
,因此使用 b
.
- 要传递给
realloc()
的大小应该是 sizeof(double) * (CONST1 + CONST2)
,而不是 CONST1 + CONST2
。
此外,分配的任何内容都应该被释放,因此您应该在 return 0;
之前添加 free(b);
。
我尝试在我正在处理的代码中使用 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
碰巧 与 a
和某些 [=13] 相同=] 字节写入新分配的缓冲区之后的缓冲区来管理一些东西。
你犯了两个错误:
- 传递给
realloc()
的a
被释放,根据N12567.20.3.4的realloc函数,所以一定不要使用。您将新指针分配给b
,因此使用b
. - 要传递给
realloc()
的大小应该是sizeof(double) * (CONST1 + CONST2)
,而不是CONST1 + CONST2
。
此外,分配的任何内容都应该被释放,因此您应该在 return 0;
之前添加 free(b);
。