我想为某个大小的结构(例如,20个字节)分配足够的内存,加上额外的字节数,比如500(这个数字是在运行时计算的,因此不能简单地是结构的附加字段) ) . 所以,我有一个看起来像这样的malloc:
some_struct *my_struct = (some_struct *) malloc (STRUCT_SIZE + MORE_BYTES);
但是,我很确定malloc只是为结构分配了足够的内存,因为这是我将返回值转换为的指针 .
如果我试着写入应该是malloc的内存...
memcpy(((char *) my_struct) + STRUCT_SIZE, ptr_to_some_data, MORE_BYTES);
...然后尝试释放该内存,我收到以下错误:
*** glibc detected *** ./my_program: free(): invalid next size (fast): 0x09b6d3f0 ***
我相信这是因为我复制到堆内存后半部分的数据覆盖了malloc放在内存段末尾的一些信息,比如大小信息等等 .
有没有人对这个问题有所了解?非常感谢 .
- 米切尔
编辑:我发现了问题 . 这是一个字节顺序问题,我在原帖中没有提到 . 当然,在我发布Stack Overflow五分钟后,我自己解决了这个问题!我应该继续删除这篇文章吗?正如大家所指出的那样,问题不在于malloc . 谢谢你的回复 .
4 回答
你在
(char*) my_struct + STRUCT_SIZE
上调用free()吗?你不能这样做 . free期望malloc返回的指针,而不是指针的一些偏移量 .您可以通过memcpy简单地覆盖该数据 - 不要释放它 . 如果你想释放它,你也需要释放结构 .
你可能想要做的是在你的struct和malloc / free中添加一个void *字段 . 该结构的用户会认为它是不透明的,您可以在内部处理中执行任何操作 .
malloc分配您请求分配的空间 . 将它转换为您想要的类型不会告诉malloc它应该分配多少 . 我认为你的问题是
memcpy
. 你对char*
的演员应该是这样的:而不是这个:
看起来你想在结尾处有一个带有可变长度数组的结构,比如:
你这样做,不需要做指针计算:
是什么给出了错误
free(my_struct)
?它不应该 .您是否知道可以使用
foo[]
作为结构的最后一个字段,以允许您在结构结束之后访问数据?valgrind
下的输出: