C结构初始化之前使用它?

时间:2015-03-12 20:06:00

标签: c initialization structure

我不明白为什么我必须在使用它之前初始化我的结构,我在我的代码中得到这个错误,我知道如果我使用指针或者如果我初始化结构成员,但是为什么它不起作用办法 ?

#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'而未初始化。 (按“重试”调试应用程序)

并且我没有从输出

的函数中获取消息

2 个答案:

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