结构体变量初始化报错


#include
struct stu
{
int a;
}stu1;
 stu1={5};    
int main()
{
    struct stu *p;
    p=&stu1;    
    printf("%d",p->a);
}

为什么会报错

img

赋值与初始化是两个概念,初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而已一个新值来替代。赋值是语句,而初始化是在定义中的,定义和声明不是语句,语句是要在函数中才被执行的。修改如下,供参考:

#include<stdio.h>
struct stu
{
    int a;
}stu1;     //这里是声明、定义了一个结构体和一个结构体变量
//stu1 = { 5 };  这是赋值语句,语句是要在函数中执行的,所以这句应移动到 main()函数中才被执行。
int main()
{
    stu1 = { 5 };
    struct stu* p;
    p = &stu1;
    printf("%d", p->a);
}

1.stu1 ={5}修改为stu1 stu2={5};
2.p=&stu2;
因为stu1是一个结构体类型,不是一个具体参数!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7575892
  • 这篇博客你也可以参考下:【会员卡计费管理系统】
  • 除此之外, 这篇博客: 猜数字游戏(伪随机数对猜数字游戏的影响)中的 为什么会出现这个问题呢? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    通过查阅一些资料了解到:

    计算机不可能产生真正的随机数。在这里,我们使用的随机数是将随机数种子(srand函数介绍的参数)作为初始条件,经过一定的计算产生的。

    这么说可能会有一点难以理解,我们来举个游戏中的例子:

    比如LOL就有一套独立的伪随机机制,以25%暴击举例,如果蛮王第一刀没暴击,第二刀也没暴击,第三刀还是没暴击,那么第四刀暴击的几率就会大大的提升(不是25%),相信很多玩游戏的同学都会有这种体会,这里的暴击就是一个伪随机数。

  • 您还可以看一下 陈槐老师的零基础新手入门软件测试必知必会课程中的 什么是系统测试小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    可能导致结构体变量初始化报错的原因有以下几种:

    1. 结构体成员变量没有初始化

    2. 结构体成员变量的顺序不正确

    3. 声明结构体时没有使用typedef

    4. 使用了不合适的数据类型来初始化结构体成员变量

    为了解决这个问题,我们需要对结构体的成员变量进行初始化。下面是一些实现方法的示例:

    1. 手动初始化每个成员变量:
    struct Student {
        int id;
        char name[20];
        float score;
    };
    int main() {
        struct Student stu = {1, "Tom", 90.5};
        return 0;
    }
    
    1. 使用 memset() 函数进行初始化:
    struct Student {
        int id;
        char name[20];
        float score;
    };
    int main() {
        struct Student stu;
        memset(&stu, 0, sizeof(struct Student));
        stu.id = 1;
        strcpy(stu.name, "Tom");
        stu.score = 90.5;
        return 0;
    }
    
    1. 使用 typedef 关键字声明结构体,并初始化:
    typedef struct {
        int id;
        char name[20];
        float score;
    } Student;
    int main() {
        Student stu = {1, "Tom", 90.5};
        return 0;
    }
    
    1. 对结构体进行封装,并提供初始化函数:
    typedef struct {
        int id;
        char name[20];
        float score;
    } Student;
    Student init_student(int id, char* name, float score) {
        Student stu;
        stu.id = id;
        strcpy(stu.name, name);
        stu.score = score;
        return stu;
    }
    int main() {
        Student stu = init_student(1, "Tom", 90.5);
        return 0;
    }
    

    需要注意的是,结构体成员变量只能按照定义时的顺序初始化,在给成员变量赋值时也应按照相应的顺序。同时,结构体的成员变量也有不同的数据类型,需要使用相应的


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^