我今天学到了一个新技巧,包括以零长度数组结束一个结构,以允许该数组根据我的需要动态调整大小。当我想决定我的结构将在运行时而不是编译时占用的空间量时,这非常方便并且有助于节省大量内存。
使用它们效果很好;然后我记得我需要释放我分配的内存,所以我只是扔了一个 free(struct);在那里,但令我沮丧的是,这给了我一个错误:
*** glibc detected *** ./program: free(): invalid next size (fast): <address>
======= Backtrace: =========
<omitted>
======= Memory Map: ========
<omitted>
这是一个格式不正确的代码的简单示例:
struct Stuff {
int size; // defines the amount of bytes the entire struct will take up
char data[0];
}
...
// This gives me an int and a char[30].
struct Stuff *ptr = (struct Stuff *) malloc(sizeof(struct Stuff) + 30);
...
doStuff();
...
free(ptr);
我得到了 free(ptr) 的错误;
有什么想法吗?
最佳答案
您的 malloc()
/free()
代码没问题。要验证,请注释掉 malloc()
和 free()
之间的所有内容,然后查看问题是否消失(我敢打赌它会消失)。
您几乎肯定会在某处(可能在 doStuff()
中)写入已分配内存的末尾。例如,如果 doStuff()
使用 ptr->size
来确定 ptr->data
的大小,确保 ptr->size
已正确初始化。
关于c - 释放 C 中零长度数组的已分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340053/