当我尝试浏览文件时,它会覆盖我要保存到的数组吗?

时间:2019-01-08 10:29:35

标签: c file

    char * names[10];
    int i = 0;
    char theRow[20];

    while (fgets(theRow, 80 , fp) != NULL) {
        names[i] = theRow;
        i++;
    }

我要保存到的数组的输出完全相同,具体取决于最后一个元素。

例如文件具有(hiI23karl
然后该数组变为(karlkarlkarlkarlkarl

我错过了什么吗?

1 个答案:

答案 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);