Возникли проблемы с перезаписи массива

Я пытаюсь загрузить словарь scrabble в память, но когда я распечатываю содержимое словаря, он, кажется, переписал каждую строку в моем массиве данных с последней строкой, видимой buf, например, когда я распечатываю массив данных в самом конце, каждая запись в массиве – «zzz», потому что последняя запись в scrabble.txt. Я не понимаю, почему он переписывается? Что я делаю неправильно?

#include  #include  #include  #include  #define LEN 100 struct data_t { int nval; /* current number of values in array */ int max; /* allocated number of values */ char **data; /* the data array */ }; enum {INIT = 1, GROW = 2}; int main(void) { FILE *fp = fopen("scrabble.txt", "r"); char buf[LEN]; int i = 0; struct data_t *data = malloc(sizeof(struct data_t)); data->nval = INIT; data->max = INIT; data->data = NULL; while (fgets(buf, LEN, fp)) { if (data->data == NULL) { data->data = malloc(LEN); assert(data->data); } else if (data->nval > data->max) { data->data = realloc(data->data, GROW * data->max * LEN); assert(data->data); data->max = GROW * data->max; } //printf("%s\n",buf); data->data[i] = buf; //printf("data->data[%d] = %s ", i, data->data[i]); i++; data->nval++; } /* overcounted */ data->nval--; for(i = 0; i nval; i++) printf("data->data[%d] = %s", i, data->data[i]); fclose(fp); free(data->data); return 0; } 

Ты пишешь:

 data->data[i] = buf; 

Это делает указатель data->data[i] указывать на буфер buf . Вы делаете это каждый раз вокруг цикла, так что вы получаете все ваши указатели, указывающие на buf . Поэтому, когда вы выводите то, на что указывает каждый указатель, он выводит содержимое buf много раз.

Вероятно, вы захотели использовать другой буфер для каждой строки. Вам нужно будет использовать malloc или связать с ним выделение этих буферов. Например, замените data->data[i] = buf; с:

 data->data[i] = strdup(buf); 

( strdup не является стандартной функцией C, но если ваша система ее не имеет, вы можете malloc(strlen(buf)+1) за которой следует strcpy ).