不能将fscanf转换为双重引用指针

时间:2010-12-04 22:33:25

标签: c pointers scanf

我的程序中的其他地方有一个数组:

data=malloc(sizeof(int)*lines);

我想将文件中的数据读入此数组。我打开了文件等。

我创建了一个函数来将数据读入这个数组:

int readfile(FILE* fp,int** storage_array,int lines)

{
    int i=0;

    for(i=0; i<lines; i++)
    {
        fscanf(fp,"%lf",&(**storage_array+i));
    }


    rewind(fp);

    return 0;

}

Dev c ++给了我

invalid lvalue in unary '&'

我尝试了很多不同的方法让它发挥作用,这真的让我很紧张:(

你有没有想到我做错了什么?

非常感谢:)

2 个答案:

答案 0 :(得分:0)

您应该仔细查看使用指针的方式及其在问题中的显示...

  1. 如果函数将数据读入数组,函数的用法返回0 - 为什么返回0?它是多余的,使void功能....
  2. 你缺乏理解指针显然很弱......你正在使用一个双指针变量,它通过引用传递,所以你使用了一个不正确的双重引用 - 这应该是一个单一的去引用,因为另一个星号表示该变量的地址......
  3. 如果这是你的绊倒,为什么不这样做,读入一个单独的变量并将变量填入数组的by-reference参数,以便更容易避免复杂性并使问题与指针混淆
  4. 见下文......错误检查被省略....

    void readfile(FILE* fp,int** storage_array,int lines)
    {
        int i=0;
    
        for(i=0; i<lines; i++)
        {
            int readval = 0;        
            fscanf(fp,"%d",&readval);
            *(storage_array[i]) = readval;
        }
        rewind(fp);
    }
    

答案 1 :(得分:0)

在C中,指向int(int *)变量的变量保存整数的地址,也可以用于保存多个数组中第一个整数的地址,因为你可以到达第二个和后续的整数只是添加到第一个地址。 malloc()为您提供了一个内存块的地址,您将用它来保存lines个连续的整数,因此您应该将它给出的地址存储在指针到int的变量中,以及相关的readfile()参数也应该具有此类型。

readfile()内,您希望为fscanf()调用第i个整数的地址。您只需将i添加到原始地址即可获得此功能,因为C负责为您i乘以sizeof (int)

int *data;
data=malloc(sizeof(int)*lines);
readfile(fp, data, lines);

...

free(data);    /* Don't forget to release the memory eventually */

...

int readfile(FILE* fp,int* storage_array,int lines)
{
    int i=0;

    for(i=0; i<lines; i++)
    {
        fscanf(fp,"%lf",storage_array+i);
    }


    rewind(fp);

    return 0;

}

fscanf()行可以等效编写

fscanf(fp,"%lf",&(*(storage_array+i)));

甚至

fscanf(fp,"%lf",&storage_array[i]);

因为在C中,表达式*(a + b)a[b]在各个方面都是等价的。