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

标签 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 的行为。

最佳答案

假设 double 是 8 字节长,我猜 b happeneda 相同并且在新分配的缓冲区之后,一些 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/

相关文章:

c - 读取 EEPROM AVR

c - 使用 sscanf 检查字符串格式

c - 为什么 4 线程程序在 1 核 VM 上比在 4 核 VM 上运行得更快?

c - 如何创建字符串数组的锯齿状数组

c++ - 为什么在重新分配失败后无法访问先前分配的内存?

c - C 中的 Realloc 分配

c - ANSI C union ——它们真的有用吗?

c - 包含动态数组的结构

c - 为什么 realloc 在此示例中不起作用?

c - 多个 realloc 是否比一个巨大的 malloc 更昂贵?