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);