realloc不提供旧数组中的所有值

时间:2016-03-09 04:06:05

标签: c realloc

我尝试在我正在处理的代码中使用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

1 个答案:

答案 0 :(得分:3)

假设double长度为8个字节,我猜b 发生a相同,并写入了一些0x00个字节在新分配的缓冲区之后对缓冲区进行管理。

你犯了两个错误:

  • 根据N1256 7.20.3.4重新分配函数,传递给a的{​​{1}}已取消分配,因此您不得使用它。您已将新指针指定为realloc(),因此请使用b
  • 传递给b的尺寸应为realloc(),而不是sizeof(double) * (CONST1 + CONST2)

此外,应释放分配的内容,因此您应在CONST1 + CONST2之前添加free(b);