Q:

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;
}

A:

#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;
}

