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

标签 c arrays memory-management struct free

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

使用它们效果很好;然后我记得我需要释放我分配的内存,所以我只是扔了一个 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/

相关文章:

c - TerminateThread() 在终止线程时返回错误

java - 如何使用循环移动数组中的每个元素?

java - Java 中 String flyweight 实现的最佳替代方案

python - 在 Windows 10 任务管理器的内存使用 View 中绘制正弦曲线?

c - 数组中有符号和无符号字符的索引有什么区别?

在keil ide中从c源代码调用汇编例程

无法将 char 分配给 char 指针

javascript - react : Cannot access index of an array in a state (index undefined)

javascript - lodash/下划线查找数组中非唯一元素的数量

C++析构函数删除共享内存