在Linux Debian中编译的C代码失败了

时间:2014-06-19 03:56:38

标签: c linux pointers struct

我正在编写C程序,我在函数中使用struct和pointer。一切都适用于Windows,但不是linux debian。当我尝试在Linux Debian中编译我的程序时,我遇到了一些错误。

typedef struct human
{
char name[100],code[100];
}human;

void hello(char* name, char* code)
{}

int main()
{
human human;
hello(&human.name,&human.code);
return 0; 
}

我在编译main.c文件时收到了警告:

Warning passing argument 1 of Human from incompatible pointer type
Note: expected char *a but argument is type of char(*)[100]
Warning passing argument 2 of Human from incompatible pointer type
Note: expected char *a but argument is type of char(*)[100]

2 个答案:

答案 0 :(得分:4)

typedef struct human
{
    char name[100], code[100];
} human;

void hello(char* name, char* code)
{
}

int main()
{
    human human;
    hello(human.name, human.code);
    return 0; 
}

在传递&name数组时删除&符号(code)。 char数组与char*兼容。当你说human.name时,你实际上指的是数组中第一个元素的地址。

此外,如果hello未返回任何内容,则其返回类型应为void。如果省略返回类型,则假设为int,但这是一种非常古老的做法,并且非常劝阻。

在使用GCC进行编译时,总是至少使用-Wall。最佳实践(您应该尽快习惯):

gcc -Wall -Wextra -Werror foo.c

最后,使用适当的缩进!

答案 1 :(得分:0)

错误基本上意味着您将数组的地址传递给期望char数组的函数。

human.name的类型是char [100],即大小为100的char数组。当您将其作为human.name传递给函数时,它会衰减到该数组的基址其类型为char*。所以,一切都很好,你实际上只想要这种行为。

现在,您尝试传递&human.name,这意味着您尝试将human.name数组的地址传递给函数,该函数的类型为char (*) [100](指向{{1}的指针大小为100的数组),因此发生类型不匹配。