【问题标题】:realloc fails with pointer arrayrealloc 因指针数组而失败
【发布时间】:2021-12-07 08:07:09
【问题描述】:

我想创建一个指向任意类型的指针数组并调整其大小。但是由于某种原因,这在第五次迭代中崩溃了:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int **data = NULL;
    size_t size = 0;

    for (size_t i = 0; i < 10; ++i) {
        printf("begin iteration #%lu...\n", i + 1);
        int *a = malloc(sizeof *a);
        data = realloc(data, ++size);
        data[size - 1] = a;
    }
}

输出是:

begin iteration #1...
begin iteration #2...
begin iteration #3...
begin iteration #4...
begin iteration #5...
realloc(): invalid next size
Aborted (core dumped)

我知道已经有很多关于realloc(): invalid next size 的问题,我查看了其中的许多问题,但我仍然无法弄清楚。我很确定我在这里遗漏了一些相当基本的东西。

【问题讨论】:

  • "一个指向 arbitrary 类型的指针数组" 嗯...那你为什么要使用int*
  • @4386427 因为这是一个例子。
  • 关于:int *a = malloc(sizeof *a); 这会导致不可恢复的内存泄漏

标签: c memory


【解决方案1】:

您没有分配足够的空间:

data = realloc(data, ++size);

这是告诉realloc 分配++size 字节,所以第一次交互时 1 个字节,第二次交互时 2 个,依此类推。这不足以容纳您要存储的内容,所以你正在写超过分配内存的末尾,触发未定义的行为。

您需要将此值乘以元素大小。

data = realloc(data, ++size * sizeof *data);

另外,您在这里使用了错误的格式说明符:

printf("begin iteration #%lu...\n", i + 1);

对于size_t,大小修饰符是z

printf("begin iteration #%zu...\n", i + 1);

【讨论】:

    【解决方案2】:

    好吧,至少有一个问题是您分配的是 size 字节而不是元素。

    data = realloc(data, ++size * sizeof *data);
    

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多