C结构在使用前初始化吗?

C structure initialization before using it?

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

#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',但未进行初始化。 (按重试调试应用程序)

而且我没有从我的函数输出消息

您收到此错误,因为您的调试器检测到您正在向函数发送单元化变量。它不知道,你将在函数内部用它做什么,所以它会警告你。你可以看到,如果你 运行 程序在 release 中,不会发生错误。对你来说最简单的解决方案,如果你知道,你最近将它初始化为正确的值,就是在创建 student a = {0};

时初始化它

您正在按值将对象 a 传递给 function。由于 C 具有 only 值语义,因此在这种情况下它只能复制值。因此,您使用单元化对象初始化参数(即使您的实现不关心参数),这需要从该对象中读取。这是未定义的行为,因此编译器会通知您您正在做一些非法的事情。

如果你通过指针传递对象,你仍然是按值传递,但被复制的值是指针。因此您不必读取实际值,您的编译器也不会抱怨。

观察:

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
}