参数C的类型无效

时间:2017-05-07 18:34:43

标签: c arrays file

我正在尝试实现一个从文件读取行并将它们放入字符串数组的函数。但它给了我警告:

  

期望的char **但是参数的类型为char *(*)[(sizetype)(numberOfchar)]

它正在Windows上运行但是当我切换到Linux时它停止工作。

这是调用者和数组变量:

char *hashes[numberOfchar];
PutInArray(textName, numberOfchar, &hashes);

这是函数(void*用于程序的下一部分,线程化):

void* PutInArray(char* k, int d, char *tab[d]) {
  FILE* fp = NULL;
  int i;
  fp = fopen(k, "r");

  if(fp != NULL) {
    for (i = 0; i < d; i++) {
      tab[i] = (char *)malloc((34) * sizeof(char));
      fgets(tab[i], 34, fp);

    }
    fclose(fp);
  }
}

2 个答案:

答案 0 :(得分:0)

你的代码几乎没问题。关于您收到的错误/警告,请写下PutInArray(textName, numberOfchar, hashes)而不是PutInArray(textName, numberOfchar, &hashes),原因如下:

在函数PutInArray(char* k, int d, char *tab[d])中,char *tab[d]char*[]char**具有相同的含义,即它表现为指向char的指针。

然后将hashes定义为char *hashes[numberOfchar],这是一个指向char的指针数组。当使用hashes作为函数参数时,hashes衰减到指向数组第一个条目的指针,即类型为char **的值,它与参数类型{{1}匹配}。但是,如果你传递tab,那么你将传递一个指向&hashes类型的指针,这是一个间接到很多。 (顺便说一句:通过char *[]会没问题。)

顺便说一句:&hashes[0]应该返回一个值,或者应该声明为PutInChar(而不是void PutInArray(char* k, int d, char *tab[d]))。

答案 1 :(得分:0)

让我们看看函数调用如何适用于其他类型。

您有一个变量int v;和一个函数void foo(int x)(变量声明和参数声明看起来相同)。你打电话给foo(v)。你还有一个函数void bar(int* x)(变量声明比参数声明少一颗星)。你拨打bar(&v)

您有一个变量int* v;和一个函数void foo(int* x)(变量声明和参数声明看起来相同)。你打电话给foo(v)。你还有一个函数void bar(int** x)(变量声明比参数声明少一颗星)。你拨打bar(&v)

您有一个变量const struct moo ***v和一个函数void foo(const struct moo ***x)(变量声明和参数声明看起来相同)。你打电话给foo(v)。你还有一个函数void bar(const struct moo ****x)(变量声明比参数声明少一颗星)。你拨打bar(&v)

您有一个变量char *hashes[numberOfchar]和一个函数void* PutInArray(char* k, int d, char *tab[d])。变量声明和参数声明看起来仍然相同。为什么在上帝的绿色地球上将&贴在变量前面?

我听到你说“但我希望通过引用传递hashes,并通过引用传递我需要使用&”。不,数组会自动通过引用传递(或者更确切地说,数组会自动转换为第一个元素的指针;数组类型的参数也会被类似地调整,以便上面制定的规则正常工作)。

为了完整性,bar的类似物将具有如下所示的参数:

char* (*tab)[numberOfchar]

如果您有这样的参数,则必须使用&hashes。但你不需要它。