请查看 C 代码并帮助我。为什么我有“free():无效的下一个尺寸(快速)”?我尝试 valgrind,但不明白,有太多“无效的写入/读取......”,但如果我评论 free_array(all) 有正确的答案。它只是所有代码的一部分。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
struct pair {
uint32_t num;
uint32_t effect;
};
struct array {
size_t size;
struct pair data[];
};
size_t sizeof_array(size_t size)
{
return sizeof(struct array) + (size * sizeof(uint32_t));
}
struct pair *create_pair(uint32_t i, uint32_t eff)
{
struct pair *ret = calloc(2, sizeof(uint32_t));
if (! ret)
abort();
ret->num = i;
ret->effect = eff;
return ret;
}
struct array *create_array(size_t size)
{
struct array *ret = calloc(1, sizeof_array(size));
if (! ret)
abort();
ret->size = size;
return ret;
}
void free_array(struct array *array)
{
// size_t i;
// for (i = 0; i < array->size; ++i) {
// free(&array->data[i]);
// }
free(array);
}
int main()
{
int eff;
size_t n;
scanf("%zu", &n);
struct array *all = create_array(n);
size_t i;
for(i = 0; i < n; ++i) {
scanf("%d", &eff);
all->data[i] = *create_pair(i, eff);
}
free_array(all);
return 0;
}
最佳答案
就像我在评论中所说的那样,在分配内存时不要使用结构体每个成员的大小作为基础,而应使用实际的结构体。这是导致问题的原因,因为您的函数 sizeof_array
返回的大小大约是您所需大小的一半。
相反,它应该看起来像
size_t sizeof_array(size_t size)
{
return sizeof(struct array) + (size * sizeof(struct pair));
/* Notice the use of the structure instead ^^^^^^^^^^^ */
}
因为 sizeof_array
返回的大小太小,所以您分配的内存太少并且写入超出了分配的内存范围,然后最终导致未定义的行为。 p>
<小时/>
当您为数组中的每个结构对
分配内存时,还会出现内存泄漏。当您分配 array
结构时,您已经为每个 pair
分配了内存,无需逐一分配,特别是因为您只需丢弃指针并因此拥有内存泄漏。
释放时,只需释放 array
结构,因为这就是您(应该)分配的全部内容。
关于c - 为什么免费(): invalid next size (fast),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19470315/