char * names[10];
int i = 0;
char theRow[20];
while (fgets(theRow, 80 , fp) != NULL) {
names[i] = theRow;
i++;
}
我要保存到的数组的输出完全相同,具体取决于最后一个元素。
例如文件具有(hi
,I
,2
,3
,karl
)
然后该数组变为(karl
,karl
,karl
,karl
,karl
)
我错过了什么吗?
答案 0 :(得分:5)
使用names[i] = nameRow;
,您一次又一次地存储相同的指针(指向相同的内存块),但是如果读取的每一行都覆盖了 contents (如果这单个块)的内存。
您需要先将读入的内容复制到缓冲区nameRow
中,然后再覆盖它,然后在循环的下一次迭代中。
names[i] = strdup(nameRow);
函数strdup
有两件事:(1)它保留足够大的内存以容纳nameRow
的副本(使用malloc
),以及(2)然后复制内容。
这也清楚地表明,以后必须复制每个条目free
。
strdup
虽然被广泛采用,但它不是标准C的一部分;因此,要成为独立于平台的平台,您必须编写...
names[i] = malloc(strlen(nameRow)+1);
strcpy(names[i],nameRow);