也許你正在使用錯誤的工具來測試你的程序。 Valgrind的肯定報告很多錯誤,當我建你的測試程序:
gcc -std=c11 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds 41147878.c -o 41147878
valgrind ./41147878
==30744== Memcheck, a memory error detector
==30744== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==30744== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==30744== Command: ./41147878
==30744==
==30744== Invalid read of size 8
==30744== at 0x10876C: main (41147878.c:10)
==30744== Address 0x51d5038 is 8 bytes before a block of size 1 alloc'd
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x108751: main (41147878.c:7)
==30744==
0
==30744== Invalid read of size 8
==30744== at 0x108797: main (41147878.c:12)
==30744== Address 0x51d5038 is 8 bytes before a block of size 1 free'd
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x10878E: main (41147878.c:11)
==30744== Block was alloc'd at
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x108751: main (41147878.c:7)
==30744==
0
==30744== Invalid free()/delete/delete[]/realloc()
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087C5: main (41147878.c:14)
==30744== Address 0x51d5040 is 0 bytes inside a block of size 1 free'd
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x10878E: main (41147878.c:11)
==30744== Block was alloc'd at
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x108751: main (41147878.c:7)
==30744==
==30744== Invalid free()/delete/delete[]/realloc()
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087D1: main (41147878.c:15)
==30744== Address 0x51d5090 is 0 bytes inside a block of size 1 free'd
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087B9: main (41147878.c:13)
==30744== Block was alloc'd at
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x10875F: main (41147878.c:8)
==30744==
==30744== Invalid free()/delete/delete[]/realloc()
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087DD: main (41147878.c:16)
==30744== Address 0x51d5040 is 0 bytes inside a block of size 1 free'd
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x10878E: main (41147878.c:11)
==30744== Block was alloc'd at
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x108751: main (41147878.c:7)
==30744==
==30744== Invalid free()/delete/delete[]/realloc()
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087E9: main (41147878.c:17)
==30744== Address 0x51d5090 is 0 bytes inside a block of size 1 free'd
==30744== at 0x4C2BDDB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x1087B9: main (41147878.c:13)
==30744== Block was alloc'd at
==30744== at 0x4C2ABAF: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30744== by 0x10875F: main (41147878.c:8)
==30744==
==30744==
==30744== HEAP SUMMARY:
==30744== in use at exit: 0 bytes in 0 blocks
==30744== total heap usage: 3 allocs, 7 frees, 1,026 bytes allocated
==30744==
==30744== All heap blocks were freed -- no leaks are possible
==30744==
==30744== For counts of detected and suppressed errors, rerun with: -v
==30744== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 0 from 0)
如果你使用一些其他的檢查來進行測試,你應該修改的問題更加具體。
雙免費不必在第一時間給出錯誤 – user3528438
這只是未定義的行爲。 – George
***'./app'錯誤:雙重空閒或損壞(fasttop):0x0000563f04897010 *** –