我正在尝试将一个拼字游戏字典加载到内存中,但是当我打印出字典的内容时,似乎已经用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("%sn",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
)。
以上就是c/c++开发分享数组被覆盖时遇到问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519593.html