数组被覆盖时遇到问题

我正在尝试将一个拼字游戏字典加载到内存中,但是当我打印出字典的内容时,似乎已经用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或related来分配这些缓冲区。 例如,替换data->data[i] = buf; 有:

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

strdup不是标准C函数,但是如果你的系统没有它,你可以使用malloc(strlen(buf)+1)然后是strcpy )。