realloc 因指针数组而失败
realloc fails with pointer array
我想创建一个指向任意类型的指针数组并调整其大小。但是由于某种原因,这在第五次迭代中崩溃了:
#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
的问题,我浏览了其中的许多问题,但仍然无法弄清楚。我很确定我在这里遗漏了一些相当基本的东西。
你分配的不够space:
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);
好吧,至少有一个问题是您分配的是 size
字节而不是元素。
data = realloc(data, ++size * sizeof *data);
我想创建一个指向任意类型的指针数组并调整其大小。但是由于某种原因,这在第五次迭代中崩溃了:
#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
的问题,我浏览了其中的许多问题,但仍然无法弄清楚。我很确定我在这里遗漏了一些相当基本的东西。
你分配的不够space:
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);
好吧,至少有一个问题是您分配的是 size
字节而不是元素。
data = realloc(data, ++size * sizeof *data);