Note that there are some explanatory texts on larger screens.

plurals
  1. POMalloc, string pointers, and Valgrind
    primarykey
    data
    text
    <p>My program is like this (<strong>main.c</strong>):</p> <pre><code>#include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; void main(){ char *first="hello "; char *second="world!"; char *seq=(char *)malloc((strlen(first)+1)*sizeof(char)); strcat(strcpy(seq,first),second); printf("%s\n",seq); free(seq); } </code></pre> <p>and I debug with the tool valgrind, it said that($:valgrind --tool=memcheck --leak-check=full --track-origins=yes ./main):</p> <pre><code>==5118== Memcheck, a memory error detector. ==5118== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al. ==5118== Using LibVEX rev 1884, a library for dynamic binary translation. ==5118== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP. ==5118== Using valgrind-3.4.1, a dynamic binary instrumentation framework. ==5118== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al. ==5118== For more details, rerun with: -v ==5118== ==5118== Invalid write of size 1 ==5118== at 0x402575B: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484EB: main (main.c:7) ==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd ==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484C3: main (main.c:6) ==5118== ==5118== Invalid write of size 1 ==5118== at 0x4025777: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484EB: main (main.c:7) ==5118== Address 0x418a034 is 5 bytes after a block of size 7 alloc'd ==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484C3: main (main.c:6) ==5118== ==5118== Invalid read of size 1 ==5118== at 0x4025963: strlen (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x40A0FA4: puts (in /lib/libc-2.10.1.so) ==5118== by 0x80484F7: main (main.c:8) ==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd ==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484C3: main (main.c:6) ==5118== ==5118== Invalid read of size 1 ==5118== at 0x40ACEFE: _IO_default_xsputn (in /lib/libc-2.10.1.so) ==5118== by 0x40AA3D0: _IO_file_xsputn@@GLIBC_2.1 (in /lib/libc-2.10.1.so) ==5118== by 0x40A1020: puts (in /lib/libc-2.10.1.so) ==5118== by 0x80484F7: main (main.c:8) ==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd ==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484C3: main (main.c:6) hello world! ==5118== ==5118== ERROR SUMMARY: 17 errors from 4 contexts (suppressed: 13 from 1) ==5118== malloc/free: in use at exit: 7 bytes in 1 blocks. ==5118== malloc/free: 1 allocs, 0 frees, 7 bytes allocated. ==5118== For counts of detected errors, rerun with: -v ==5118== searching for pointers to 1 not-freed blocks. ==5118== checked 47,492 bytes. ==5118== ==5118== ==5118== 7 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==5118== by 0x80484C3: main (main.c:6) ==5118== ==5118== LEAK SUMMARY: ==5118== definitely lost: 7 bytes in 1 blocks. ==5118== possibly lost: 0 bytes in 0 blocks. ==5118== still reachable: 0 bytes in 0 blocks. ==5118== suppressed: 0 bytes in 0 blocks. </code></pre> <p>Who can tell me why and how to fix it.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload