释放C中零长度数组的已分配内存

Max*_*ost 4 c arrays free struct memory-management

我今天学到了一个新技巧,包括结束一个带有零长度数组的结构,以允许该数组根据需要动态调整大小.这非常方便,当我想确定我的struct在运行时而不是编译时占用的空间量时,可以节省大量内存.

使用它们完美无缺; 然后我记得我需要释放我分配的内存,所以我只是扔了一个免费的(struct); 在那里,但令我沮丧的是,这给我一个错误:

    *** glibc detected *** ./program: free(): invalid next size (fast): <address>
    ======= Backtrace: =========
     <omitted>
    ======= Memory Map: ========
     <omitted>
Run Code Online (Sandbox Code Playgroud)

这是一个格式不佳的代码中的简单示例:

   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);
Run Code Online (Sandbox Code Playgroud)

我得到了免费的错误(ptr);

有任何想法吗?

NPE*_*NPE 6

你的malloc()/ free()代码很好.要验证,注释掉malloc()和之间的所有内容free(),并查看问题是否消失(我敢打赌).

你几乎肯定会在某处(可能在doStuff())中写入已分配内存的末尾.例如,如果doStuff()用于ptr->size确定大小ptr->data,请确保ptr->size正确初始化.