title: C string from GetString() when strlen produces segmentation fault
body: <p>I am running a program in C. When I run the program I get a segmentation fault error. IN gdb when I backtrace it tells me </p>
  
  <blockquote>
    <p>Program received signal SIGSEGV, Segmentation fault.
    __strlen_sse2_bsf () at ../sysdeps/i386/i686/multiarch/strlen-sse2-bsf.S:51 51        movdqu  (%edi),
    %xmm1</p>
  </blockquote>
  
  <p>I believe it has to do with strlen. </p>
  
  <p>The only time I use strlen is:</p>
  
  <pre><code>    string s = GetString();
  
      int stringlength = strlen(s);
  </code></pre>
  
  <p>When I change strlen for sizeof error stops. </p>
  
  <p>What is wrong with my code? </p>
  
  <p>Documentation of GetString</p>
  
  <pre><code>/*
   * Reads a line of text from standard input and returns it as a 
   * string (char *), sans trailing newline character.  (Ergo, if
   * user inputs only "\n", returns "" not NULL.)  Returns NULL
   * upon error or no input whatsoever (i.e., just EOF).  Leading
   * and trailing whitespace is not ignored.  Stores string on heap
   * (via malloc); memory must be freed by caller to avoid leak.
   */
  
  string GetString(void) {
      // growable buffer for chars
      string buffer = NULL;
  
      // capacity of buffer
      unsigned int capacity = 0;
  
      // number of chars actually in buffer
      unsigned int n = 0;
  
      // character read or EOF
      int c;
  
      // iteratively get chars from standard input
      while ((c = fgetc(stdin)) != '\n' &amp;&amp; c != EOF)
      {
          // grow buffer if necessary
          if (n + 1 &gt; capacity)
          {
              // determine new capacity: start at 32 then double
              if (capacity == 0)
                  capacity = 32;
              else if (capacity &lt;= (UINT_MAX / 2))
                  capacity *= 2;
              else
              {
                  free(buffer);
                  return NULL;
              }
  
              // extend buffer's capacity
              string temp = realloc(buffer, capacity * sizeof(char));
              if (temp == NULL)
              {
                  free(buffer);
                  return NULL;
              }
              buffer = temp;
          }
  
          // append current character to buffer
          buffer[n++] = c;
      }
  
      // return NULL if user provided no input
      if (n == 0 &amp;&amp; c == EOF)
          return NULL;
  
      // minimize buffer
      string minimal = malloc((n + 1) * sizeof(char));
      strncpy(minimal, buffer, n);
      free(buffer);
  
      // terminate string
      minimal[n] = '\0';
  
      // return string
      return minimal;
  }
  </code></pre>