正如其他人指出的那样,问题在于您将错误类型的参数传递给userComFunction
. 但真正的问题是你的编译器没有告诉你。
从 C90(这是两个标准之前)开始,调用没有可见声明的函数是合法的,编译器会对函数的实际外观做出假设(通常是不正确的)。当编译器看到对 的调用时userComFunction
,它没有看到对 的声明或定义userComFunction
,因此它无法诊断您的错误。
从 C99 开始,调用没有可见声明的函数是违反约束的,这意味着编译器至少必须警告您。C99 还删除了“隐式int
”规则,因此您不能再在函数声明中省略返回类型;main
应该用int
返回类型(不是 void
!)声明,并且userComFunction
,因为它不返回任何东西,所以应该是void
.
您可以将 的完整定义移到 的定义userComFunction
之上main
,也可以将定义保留在原处并添加“转发”声明:
void userComFunction(struct userCom *return_type);
int main(void) {
/* ... */
}
void userComFunction(struct userCom *return_type) {
/* ... */
}
当你这样做时,编译器应该让你知道你的调用:
userComFunction(com);
是不正确的。(解决方法是更改com
为&com
。)
您还应该使用 gcc 的命令行选项来启用更多警告。例如:
gcc -std=c99 -pedantic -Wall -Wextra
-std=c99
说要执行 ISO C99 规则。-pedantic
说要真正执行这些规则。-Wall
并-Wextra
启用其他警告。