-2

我无法将传递结构的指针分配给我的代码(简单地说)是

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

4

2 回答 2

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启用其他警告。

于 2013-10-08T18:57:28.623 回答
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;
}
于 2013-10-08T19:00:00.323 回答