C语言调用含结构体的自定义函数报错原因及写法差异
C语言问题解答
报错原因
C语言中局部变量的作用域仅局限于定义它的代码块内部,函数内部定义的变量属于该函数的私有局部变量,仅在函数执行过程中有效,函数执行结束后变量就会被系统回收销毁,对外完全不可见。
你在add()函数内部定义的o、o2两个结构体变量,是仅属于add()的局部变量,哪怕你在main中调用了add(),这两个变量也不能被main访问到。同时你注释掉了main内部的o、o2变量声明,main的作用域内没有这两个变量的定义,编译时会直接报「未声明的标识符」错误,无法正常运行。
两种add写法的区别
Type-1
void add(){ struct student o,o2; }
这是完整的无参函数定义:它实现了一个返回值为空、无需传入参数的add函数,函数内部定义了两个struct student类型的局部变量o、o2,但没有任何对外传递值的逻辑,函数执行结束后这两个变量就会被销毁,调用该函数没有实际业务作用。
Type-2
void add(struct student o,o2);
这是函数声明,不是函数实现:它的作用是向编译器声明存在一个名为add的函数,返回值为空,需要传入两个struct student类型的参数,这里的o、o2只是参数的占位名称,可省略,等价于void add(struct student, struct student);。该声明本身不会创建任何变量,也没有对应的执行逻辑,如果没有补充编写对应的函数体,调用时会触发链接错误。
内容的提问来源于stack exchange,提问作者shaila
相关产品推荐
相关产品推荐

