char * names[10];
int i = 0;
char theRow[20];
while (fgets(theRow, 80 , fp) != NULL) {
names[i] = theRow;
i++;
}
Run Code Online (Sandbox Code Playgroud)
我试图保存的数组的输出完全相同,具体取决于最后一个元素.
对于前 文件具有(hi,I,2,3,karl)
阵列然后变成(karl,karl,karl,karl,karl)
我错过了什么或者它能做什么?
有了names[i] = nameRow;,你一次又一次地存储相同的指针(到同一个内存块),但是对于你读过的每一行,如果这一块内存都会覆盖内容.
您需要将读入的内容复制到缓冲区中nameRow,然后再覆盖它,然后再循环下一次迭代.
names[i] = strdup(nameRow);
Run Code Online (Sandbox Code Playgroud)
函数strdup做两件事,(1)它保留足够大的内存来保存nameRow(使用malloc)的副本,(2)然后复制内容.
这也清楚地表明您将需要free稍后复制每个条目.
并且,虽然被广泛采用,但strdup不是标准C的一部分; 所以为了独立于平台,你必须写...
names[i] = malloc(strlen(nameRow)+1);
strcpy(names[i],nameRow);
Run Code Online (Sandbox Code Playgroud)