C语言中的结构和功能

时间:2013-10-08 18:43:15

标签: c struct

我无法将一个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

2 个答案:

答案 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;
}