C 错误:free():下一个大小无效(fast)
当我在这部分代码中释放内存时…我得到一个错误,显示为:free():无效的下一个大小(fast)C 错误:free():下一个大小无效(fast),c,data-structures,struct,free,memcpy,C,Data Structures,Struct,Free,Memcpy,当我在这部分代码中释放内存时…我得到一个错误,显示为:free():无效的下一个大小(fast) 在memcpy之前,我保留了免费的(数据页),它工作正常,但在memcpy之后,它就不工作了。。并且显示错误…有人能帮我解决这个问题吗…您几乎肯定是在写入您分配的结构的末尾,很可能是在写入数据[]成员时,该成员只有足够的空间容纳一个元素。(任何大于0的索引都将写入已分配的内存,并可能覆盖已分配块的元数据。) 如果您希望获得有关stackoverflow的帮助,我强烈建议您开始接受提供给您的一些答案。
在memcpy之前,我保留了免费的(数据页),它工作正常,但在memcpy之后,它就不工作了。。并且显示错误…有人能帮我解决这个问题吗…您几乎肯定是在写入您分配的结构的末尾,很可能是在写入
数据[]
成员时,该成员只有足够的空间容纳一个元素。(任何大于0的索引都将写入已分配的内存,并可能覆盖已分配块的元数据。)
如果您希望获得有关stackoverflow的帮助,我强烈建议您开始接受提供给您的一些答案。您的错误可能超出了此代码片段的范围。我强烈建议您使用
gcc-Wall-g
(在Linux上)编译所有程序,改进代码直到没有警告,使用gdb
并调试您的程序
如果您在其他系统上,请尝试在编译过程中启用所有警告和调试信息,并使用内存泄漏检测器。如果
dataPage->data
条目在边界之外写入,则可能会出现这种情况。此结构项只有一个字节长,因此除非slot.slotaddress==0
和recordSize==1
,否则您将写入datapage
struct
结束后的内存。这可能是导致您的free
错误的原因
要跟踪此类错误,我建议通过valgrind
运行程序:
valgrind progname args
在这种情况下,您可能会收到关于“无效写入”的消息,这些消息告诉您正在数组边界之外进行写入。我正在查看memcpy()行:
memcpy(&dataPage->data[slot.slotaddress],record,recordSize)代码>
下面是该函数的用法:
void*memcpy(void*dest,const void*src,size\u t n)代码>
第一个参数是目标:&dataPage->data[slot.slotaddress]
对我来说,这意味着你要求它存储数据,从你分配的结构的dataPage->data
部分开始,所以你基本上是在覆盖你的数据,并将其传递到la la land。注意,这个错误消息是一个很好的例子,说明了如何不编写错误报告代码。如前所述,它只对调试malloc
的内部实现的人有意义,对像OP这样的程序崩溃的人来说,充其量只是一种迷惑。写得好的错误消息应该报告“致命错误:此应用程序执行了越界内存写入并损坏了内存分配器的内部状态。”
typedef struct
{
int pagenumber;
int priority;
long dirPageNo;
long cfs;
int cfsptr;
int slotcount;
char data[1];
} datapage;
typedef struct
{
int slotaddress;
int slotsize;
} slotentry;
valgrind progname args