Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中释放零长度数组的分配内存_C_Arrays_Memory Management_Struct_Free - Fatal编程技术网

在C语言中释放零长度数组的分配内存

在C语言中释放零长度数组的分配内存,c,arrays,memory-management,struct,free,C,Arrays,Memory Management,Struct,Free,今天我学习了一个新技巧,包括用一个零长度数组结束一个结构,以便根据需要动态调整该数组的大小。这非常方便,当我想确定我的结构在运行时而不是编译时消耗的空间量时,它有助于节省大量内存 使用它们非常有效;然后我想起我需要释放分配的内存,所以我扔下了一个free(struct);但令我沮丧的是,这让我犯了一个错误: *** glibc detected *** ./program: free(): invalid next size (fast): <address> ===

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

使用它们非常有效;然后我想起我需要释放分配的内存,所以我扔下了一个free(struct);但令我沮丧的是,这让我犯了一个错误:

    *** glibc detected *** ./program: free(): invalid next size (fast): <address>
    ======= Backtrace: =========
     <omitted>
    ======= Memory Map: ========
     <omitted>
我免费得到错误(ptr)

有什么想法吗?

你的
malloc()
/
free()
代码很好。要进行验证,请注释掉
malloc()
free()
之间的所有内容,然后查看问题是否消失(我打赌它会消失)


您几乎肯定会在某个地方(可能在
doStuff()
中)写入超过分配内存末尾的内容。例如,如果
doStuff()
使用
ptr->size
确定
ptr->data
的大小,请确保
ptr->size
已正确初始化。

可能无论您在
doStuff()
中执行什么操作,都使用了超出结构头之外的30个额外字节。确保您正确计算了所需的空间量。

删除doStuff(),然后重试。您是否有相同的错误?

可能您的代码在某个地方更改了
ptr的值

使用:

struct Stuff * const ptr = ...
而不是:

struct Stuff * ptr = ...

在编译时检测此类问题。

您在doStuff方法中使用ptr做什么(问题可能就在那里)?您可能正在运行
数据的末尾,并损坏堆中的某些内容-在调用
free()
之前,问题不会出现,但是
free()
本身不是问题所在。还要注意的是,不应强制转换
malloc
的返回,长度为零的字段是非标准字段,因此不可移植。后者的标准方法是省略终止数组字段的大小。这两个看起来都可能是问题。我尝试在malloc之后释放,我的代码的其余部分工作得很好,就像从来没有释放过一样。我想我需要做大量的猎虫工作。我在问题结构上抛出了几个memset(),它似乎解决了问题。谢谢你的提示!“似乎解决了问题”->translation->“暂时屏蔽了我代码中的bug,这样它们很可能会在以后再来咬我”。不,你只是假设而已。这个问题与字符串没有正确地以null结尾有关,这就是为什么它在结尾处运行。Memset解决了这个问题。
struct Stuff * ptr = ...