我今天学了一个新技巧,就是在一个结构体末尾加上一个长度为零的数组,这样可以动态地调整数组大小以满足需要。这非常方便,可以帮助我在运行时而不是编译时决定结构体所需的空间大小,从而节省大量内存。
使用它们非常完美;然后我想起需要释放已分配的内存,于是我只是在那里写了一个free(struct); 但令我失望的是,这引发了一个错误:
使用它们非常完美;然后我想起需要释放已分配的内存,于是我只是在那里写了一个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);处遇到了错误。
有什么想法吗?
data
的末尾并破坏堆中的某些内容 - 问题直到调用free()
才会显示出来,但free()
本身不是问题所在。 - Paul Rmalloc
的返回值强制转换,并且长度为零的字段是非标准的,因此不可移植。后者的标准方法是省略终止数组字段的大小。 - Jens Gustedt