title: strdup(): Confused about warnings ('implicit declaration', 'makes pointer...without a cast', memory leak)
body: <p>When I compile the short piece of code below (in which we define a string and then use strdup to make a copy), I get 3 warnings: 2 compiler warnings from GCC and 1 run-time warning/error from valgrind.  </p>
  
  <p>I suspect the memory leak error (reported by valgrind) is also related to my use of strdup, which is why I'm including the relevant output below.  </p>
  
  <p>What am I doing wrong?  (I'm working my way through a C book and this is how strdup is used by the author.)</p>
  
  <hr>
  
  <p>The code:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  
  int main(int argc, char* argv[])
  {
    char *string1 = "I love lamp";
    char *string2;
  
    string2 = strdup(string1);
  
    printf("Here's string 1: %s\n"
       "Here's string 2: %s\n",
       string1, string2);
  
    return 0;
  }
  </code></pre>
  
  <hr>
  
  <p>The warnings/output:</p>
  
  <pre><code>dchaudh@dchaudhUbuntu:~/workspaceC/LearnCHW/Ex17_StructsPointers$ make test
  cc -std=c99    test.c   -o test
  test.c: In function ‘main’:
  test.c:9:3: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
     string2 = strdup(string1);
     ^
  test.c:9:11: warning: assignment makes pointer from integer without a cast [enabled by default]
     string2 = strdup(string1);
             ^
  dchaudh@dchaudhUbuntu:~/workspaceC/LearnCHW/Ex17_StructsPointers$ valgrind --track-origins=yes --leak-check=full ./test
  ==3122== Memcheck, a memory error detector
  ==3122== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
  ==3122== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
  ==3122== Command: ./test
  ==3122== 
  Here's string 1: I love lamp
  Here's string 2: I love lamp
  ==3122== 
  ==3122== HEAP SUMMARY:
  ==3122==     in use at exit: 12 bytes in 1 blocks
  ==3122==   total heap usage: 1 allocs, 0 frees, 12 bytes allocated
  ==3122== 
  ==3122== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
  ==3122==    at 0x4C2ABBD: malloc (vg_replace_malloc.c:296)
  ==3122==    by 0x4EBF2B9: strdup (strdup.c:42)
  ==3122==    by 0x4005A4: main (in /home/dchaudh/workspaceC/LearnCHW/Ex17_StructsPointers/test)
  ==3122== 
  ==3122== LEAK SUMMARY:
  ==3122==    definitely lost: 12 bytes in 1 blocks
  ==3122==    indirectly lost: 0 bytes in 0 blocks
  ==3122==      possibly lost: 0 bytes in 0 blocks
  ==3122==    still reachable: 0 bytes in 0 blocks
  ==3122==         suppressed: 0 bytes in 0 blocks
  ==3122== 
  ==3122== For counts of detected and suppressed errors, rerun with: -v
  ==3122== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
  </code></pre>