Search code examples
carraysstringrealloc

Strings with Realloc in C


I am trying to use realloc function as making the array bigger as the user entered names. It gives me an error when I add 5. element, the error like : * glibc detected ./a.out: realloc(): invalid next size: 0x00000000017d2010 ** And the code is:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
  char **mtn = NULL;
  char x[30];
  int i = 0;

  while ( strcmp(gets(x), "finish") ){
    mtn = realloc( mtn, i*sizeof(char) );
   // mtn[i] = realloc( mtn[i], sizeof(x) ); // tried but didnt work
    mtn[i] = x;
    i++;
  }
  puts(mtn[1]);

  return 0;
}

Solution

  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
        char **mtn = NULL;
        char x[30];
        int i = 0;
    
        /* Never use gets, it's dangerous, use fgets instead */
        while (strcmp(fgets(x, sizeof(x), stdin), "finish\n")){
            /*
            your previous realloc was realloc(mtn, 0)
            and you have to take space for <char *>
            */
            mtn = realloc(mtn, (i + 1) * sizeof(char *));
            /* always check return of xalloc */
            if (mtn == NULL) {
                perror("realloc");
                exit(EXIT_FAILURE);
            }
            /* you still need space for store x */
            mtn[i] = malloc(strlen(x) + 1);
            if (mtn[i] == NULL) {
                perror("malloc");
                exit(EXIT_FAILURE);
            }
            strcpy(mtn[i], x); /* mtn[i] = x is not valid */
            i++;
        }
        printf("%s", mtn[1]);
        /* always free xallocs in order to prevent memory leaks */
        while (i--) free(mtn[i]);
        free(mtn);
        return 0;
    }