我正在尝试实现一个从文件读取行并将它们放入字符串数组的函数。但它给了我警告:
期望的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);
}
}
答案 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
。但你不需要它。