c - 数组充满了文件中的最后一个元素

标签 c arrays file token element

我有一个 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/

相关文章:

c - 当所有变量都被使用时,不会被堆叠、分配或(最近)释放

c++ - 以数学方式将 float 四舍五入到小数点后 N 位

C - 在整数变量中查找初始化数据的大小

php - 获取数组的值,指定 array1 的值内的数组的值

c# - 在 C# 中使用记事本打开文件

c - C 程序的问题

c - 这段代码发生了什么?为什么我可以迭代到 335?

python - 在 for 循环中重置数组位置

php - 如何保护处理 Jquery 数据的敏感 PHP 文件的安全?

javascript - 无法创建小型 Javascript 应用程序