我有以下代码:
int main(){
char **array;
char a[5];
int n = 5;
array = malloc(n *sizeof *array);
/*Some code to assign array values*/
test(a, array);
return 0;
}
int test(char s1, char **s2){
if(strcmp(s1, s2[0]) != 0)
return 1;
return 0;
}
我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告:
temp.c: In function ‘main’:
temp.c:6:5: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
temp.c:6:13: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
temp.c:10:5: warning: implicit declaration of function ‘test’ [-Wimplicit-function-declaration]
temp.c: At top level:
temp.c:15:5: error: conflicting types for ‘test’
temp.c:15:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
temp.c:10:5: note: previous implicit declaration of ‘test’ was here
temp.c: In function ‘test’:
temp.c:16:5: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
我试图了解问题所在 .
4 回答
首先,您应该包含必要的头文件 . 对于
strcmp
,您需要<string.h>
,对于malloc
<malloc.h>
. 你还需要在main之前至少声明测试 . 如果这样做,您会注意到以下错误:这表明
test()
应该有char *
作为第一个参数 . 总而言之,您的代码应如下所示:编辑
请注意strcmp使用以null结尾的字节字符串 . 如果
s1
和s2
都不包含空字节,则test
中的调用将导致分段错误:要么确保两者都包含空字节
'\0'
,要么使用strncmp并更改test
的签名:你的内存分配也是错误的 .
array
是char**
. 您为*array
分配内存,它本身就是char*
. 你永远不会为这个特定的指针分配内存,你错过了array[0] = malloc(n*sizeof(**array))
:Error 1
你的意思是?
Error 2
您正在传递数组的第一个元素
a
的地址:所以函数签名应该是:
你有几个问题 . 首先是原型是错误的 .
a
的数据类型在传递给函数时衰减为char指针,因此您需要:但是,即使您修复此问题,第一次使用时
test
声明也不在范围内 . 你应该提供一个原型:在
main
之前,或者只是将整个定义(函数)移到main
之前 .此外,不要忘记
test
和stdlib.h
Headers ,以便strcmp
和malloc
的原型也可用 .将char数组传递给函数时,参数会衰减为指针 . 将函数参数更改为
你的代码至少应该编译