我不明白为什么我必须在使用它之前初始化我的结构,我在我的代码中得到这个错误,我知道如果我使用指针或者如果我初始化结构成员,但是为什么它不起作用办法 ?
#include <stdio.h>
typedef struct human{
char name[20];
int age;
} student;
void function(student ){
printf("It's not working");
}
int main(){
student a;
function(a);
return 0;
}
我明白了 调试错误! 文件:运行时检查失败#3 - 正在使用变量'a'而未初始化。 (按“重试”调试应用程序)
并且我没有从输出
的函数中获取消息答案 0 :(得分:2)
您收到此错误,因为您的调试器检测到您正在将单元化变量发送到该函数。它不知道,你会在函数内部用它做什么,所以它会警告你。您可以看到,如果您在发布中运行程序,则不会发生错误。最简单的解决方案,如果您知道,最近将其初始化以更正值,只需在创建student a = {0};
时初始化它
答案 1 :(得分:1)
您将对象a
按值传递给function
。由于C只有 值语义,因此在这种情况下它只能复制值。因此,您需要使用单元化对象初始化参数(即使您的实现并不关心参数),这需要从该对象读取。这是未定义的行为,因此编译器会通知您正在执行非法操作。
如果通过指针传递对象,则仍然按值传递,但正在复制的值是指针。因此,您不必阅读实际值,编译器也不会抱怨。
观察:
void flat(student s) {
s.age = 20;
}
void ptr(student* s) {
s->age = 20;
}
int main() {
student s = {"Eve", 0};
// { s.age == 0 }
flat(s);
// { s.age == 0 } --- still the same, no change
ptr(&s);
// { s.age == 20 } --- now it has changed
}