我有一个 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);
}
最佳答案
你不应该调用 free(token)
,因为你在 a[count]
中仍然有一个指向它的指针。由于您正在释放它,因此可以重复使用该内存,并且显然它在 readLine()
读取下一行时被使用。因此,每次您读取一行时,它都会重复使用相同的内存并用下一行覆盖它。因此,a[]
的所有元素都包含指向同一行的指针。
a[count] = token
不会复制 token ,它只是分配指针。
这一切都假设 readLine()
使用 malloc()
为其读取的行分配内存。如果没有,那就更糟了,因为您不能在未使用 malloc()
或 calloc( )
。
readLine()
可能只是使用了一个静态数组变量,这也可以解释为什么所有的行都是相同的。如果您不希望它继续覆盖 token ,您需要在 readTokens()
中复制它。如果您发布了 readLine()
的定义,将会有所帮助。
关于c - 数组充满了文件中的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25770045/