Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 错误:free():下一个大小无效(fast)_C_Data Structures_Struct_Free_Memcpy - Fatal编程技术网

C 错误:free():下一个大小无效(fast)

C 错误:free():下一个大小无效(fast),c,data-structures,struct,free,memcpy,C,Data Structures,Struct,Free,Memcpy,当我在这部分代码中释放内存时…我得到一个错误,显示为:free():无效的下一个大小(fast) 在memcpy之前,我保留了免费的(数据页),它工作正常,但在memcpy之后,它就不工作了。。并且显示错误…有人能帮我解决这个问题吗…您几乎肯定是在写入您分配的结构的末尾,很可能是在写入数据[]成员时,该成员只有足够的空间容纳一个元素。(任何大于0的索引都将写入已分配的内存,并可能覆盖已分配块的元数据。) 如果您希望获得有关stackoverflow的帮助,我强烈建议您开始接受提供给您的一些答案。

当我在这部分代码中释放内存时…我得到一个错误,显示为:free():无效的下一个大小(fast)


在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