为什么我的内存访问错误“双重免费或损坏”?

我收到以下类型的错误。 我知道它与我不正确地访问内存有关,但我不知道如何。 请帮我看看我哪里出错了。

*注意我已经简化了我的function,变量正在做什么并不明显,我只需要知道我是如何错误地实现函数或者我在滥用内存访问的地方。

int my_function(char const *file_name, size_t max) { myStruct.pStore = fopen(file_name,"w+"); //pStore is a FILE* myStruct.max = max; // fill the with zeros ('0') int numberOfZeros = max*SIZE; char zeros[numberOfZeros]; int i=0; while(i<numberOfZeros) // insert zero's { zeros[i]='0'; i++; } fwrite(zeros,sizeof(char),numberOfZeros,myStruct.pStore); fclose(myStruct.pStore); return EXIT_SUCCESS; 

给出的错误:

 *** glibc detected *** /home/.../: double free or corruption (top): 0x0804c008 *** ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7e82e42] /lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb7e72384] /home/2012/spatar/cs/specs/release[0x80486b0] /home/2012/spatar/cs/specs/release[0x8048acd] /home/2012/spatar/cs/specs/release[0x8048af0] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb7e284d3] /home/2012/spatar/cs/specs/release[0x80484e1] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 00:3b 2331829 /home/2012/spatar/cs/Aspecs/release 0804a000-0804b000 r--p 00001000 00:3b 2331829 /home/2012/spatar/cs/specs/release 0804b000-0804c000 rw-p 00002000 00:3b 2331829 /home/2012/spatar/cs/specs/release 0804c000-0806d000 rw-p 00000000 00:00 0 [heap] b7e0e000-b7e0f000 rw-p 00000000 00:00 0 b7e0f000-b7fae000 r-xp 00000000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so b7fae000-b7fb0000 r--p 0019f000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so b7fb0000-b7fb1000 rw-p 001a1000 00:11 5415 /lib/i386-linux-gnu/libc-2.15.so b7fb1000-b7fb4000 rw-p 00000000 00:00 0 b7fbc000-b7fd8000 r-xp 00000000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1 b7fd8000-b7fd9000 r--p 0001b000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1 b7fd9000-b7fda000 rw-p 0001c000 00:11 5426 /lib/i386-linux-gnu/libgcc_s.so.1 b7fda000-b7fdd000 rw-p 00000000 00:00 0 b7fdd000-b7fde000 r-xp 00000000 00:00 0 [vdso] b7fde000-b7ffe000 r-xp 00000000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so b7ffe000-b7fff000 r--p 0001f000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so b7fff000-b8000000 rw-p 00020000 00:11 5405 /lib/i386-linux-gnu/ld-2.15.so bffdf000-c0000000 rw-p 00000000 00:00 0 [stack] 

看起来你正试图释放已经被释放或被解除引用的内存。

将您的程序与efence链接或使用valgrind运行它。

这将告诉您指针被取消引用的位置。

内存损坏通常是由写入超出已分配内存的末尾引起的,并且通常是一个字节,因为有人忘记添加null所需的一个字节来终止字符串。

双重自由意味着free(x)连续两次被调用,具有相同的x值。 在你的代码中的某个地方调用free(x)然后很可能在另一段代码中再次调用free(x)。

隔离问题的最简单方法是使用gdb并在逐步执行代码时观察发生的情况。

在上面的my_function代码中,没有调用malloc或free。 零缓冲区位于堆栈上,而while循环不会写入超出缓冲区的末尾。 问题出在代码的其他部分。 解决问题所需的时间取决于调用malloc / free / strdup等的位数。