我无法将一个struct的指针传递给一个函数我的代码(简单地说)是
struct userCom{
int x;
int y;
}
main(void){
struct userCom com;
userComFunction(com);
printf("%d", com.x);
}
userComFunction(struct userCom *return_type){
struct userCom temp;
temp.x = 10;
printf("%d", temp.x);
*return_type = temp;
}
会打印
10
11537460
我是否错过了指针? 我似乎无法弄清楚为什么com.x不等于10
答案 0 :(得分:3)
正如其他人所指出的,问题在于你将错误类型的参数传递给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
启用其他警告。
答案 1 :(得分:0)
如果你想将10分配给x,那么你应该这样做。 这是正确的代码 -
struct userCom{
int x;
int y;
}
void struct userComFunction(struct userCom*);
main(void)
{
struct userCom com;
userComFunction(&com);
printf("%d\n", com.x);
}
userComFunction(struct userCom *return_type){
struct userCom temp;
temp.x = 10;
printf("%d\n", temp.x);
return_type->x= temp.x;
}