我有一个过程readTokens(),它接受一个文件和一个数组并对文件进行标记并将所有内容放入数组中,但是当我访问该数组时,它充满了最后一个元素。为什么?这是我的readTokens()方法:
void
readTokens(char *fileName, char** a[])
{
FILE *fp;
char *token;
int count = 0;
fp = fopen(fileName, "r");
if (fp == 0)
{
fprintf(stderr,"file %s could not be opened for reading\n", fileName);
exit(1);
}
token = readLine(fp);
while(!feof(fp))
{
a[count] = token;
++count;
free(token);
token = readLine(fp);
}
fclose(fp);
}
答案 0 :(得分:3)
您不应该致电free(token)
,因为您仍然在a[count]
中指向它。由于您正在释放它,因此可以重复使用该内存,并且显然在readLine()
读取下一行时使用该内存。因此,每次读取一行时,它都会重用相同的内存并用下一行覆盖它。因此,a[]
的所有元素都包含指向同一行的指针。
a[count] = token
没有制作令牌的副本,它只是指定指针。
这都假设readLine()
使用malloc()
为其读取的行分配内存。如果它没有,那就更糟了,因为你不能在没有分配free()
或malloc()
的内存上调用calloc()
。 / p>
readLine()
可能只使用静态数组变量,这也可以解释为什么所有行都相同。如果您不希望它继续覆盖令牌,则需要在readTokens()
中复制该令牌。如果您发布readLine()
。