c语言结构体变量的定义


#include<stdio.h>
struct stu{
    int age;
}; 
int main(){
    stu st;
    st.age=5;
    printf("%d",st.age);
}

第六行不写struct stu st也可以运行,震惊了

c语言 , 你这个会编译报错的

img

而你这个 是 cpp文件,也就是按c++编译的, c++兼容了 c语言语法, c++ 中 这种结构体 跟类使用上是一样的,所以可以像类一样直接使用

img

没啥好震惊的,兄die。
C语言中结构体变量的定义有两种方式:

  1. 使用struct关键字定义:
struct stu{
   int age;  
};

struct stu st;  //定义结构体变量st
  1. 不使用struct关键字定义:
struct stu{
   int age;  
};

stu st; //定义结构体变量st,不使用struct关键字

两种方式在C语言中都是合法的,编译都可以通过。
区别在于:

  • 使用struct关键字更加清楚,明确表明st是结构体变量。
  • 不使用struct关键字更加简洁,但相对隐晦一些。
    结构体定义之后,结构体标签stu就变成该结构体的类型。

能运行,运行的是之前编译出来的exe吧,你重新编译试试会报错。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7447043
  • 你也可以参考下这篇文章:C语言中结构体struct的用法
  • 除此之外, 这篇博客: C语言的关键字中的 十五、struct关键字 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    struct是用来声明结构体类型的关键字。

    struct 是个神奇的关键字,它将一些相关联的数据打包成一个整体,方便使用。在网络协议、通信控制、嵌入式系统、驱动开发等地方,我们经常要传送的不是简单的字节流(char 型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

    经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改,非常容易出错。这个时候只需要一个结构体就能搞定。

  • 您还可以看一下 张云波老师的零基础也能学以太坊开发课程中的 自定义结构struct示例小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    在C语言中,正常情况下,在定义结构体变量时需要加上"struct"关键字,因为结构体是一种用户自定义的数据类型。但是在C语言中,如果省略"struct"关键字,可以直接使用结构体标签作为类型名进行变量的定义,也可以直接定义结构体类型和变量。

    例如,参考资料中的第一种方式就是标准的结构体定义方式:

    struct student 
    {
        int age;
        float score;
        char sex;
    };
    
    int main ()
    {
        struct student a={23, 98, 'f'}; 
        printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
        return 0;
    }
    

    在这种方式下,可以看到在定义结构体变量a时,前面有写明"struct student",这是符合正常的语法规范的。在其他的三种方式中,省略"struct"关键字的用法是不符合C语言的语法规范的。

    总的来说,如果在定义结构体变量时省略"struct"关键字,实际上编译器会将其视为一种类型定义,该类型的名称就是结构体标签。所以,这种用法与上述标准定义方式等效,定义的变量类型就是对应的结构体类型。

    但是需要注意,这种省略"struct"关键字的用法在可读性上是较差的,不符合编码规范。在实际开发中,建议还是按照标准定义方式来定义结构体变量,即明确写明"struct"关键字。

    如果你在程序中发现可以省略"struct"关键字而程序仍然能够正常运行,那可能是编译器的一种默认行为或者各种编译器的编译特性之一。但是不能因此认为这种用法是正确的或者合理的。

    确保程序的正确性和可读性,你应该按照标准的定义方式来定义结构体变量,即明确写明"struct"关键字,这样可以避免一些编译器和可移植性的问题。

    总结起来,没有写"struct"关键字的情况下,定义的变量类型将是对应的结构体类型,但这种用法不符合C语言的编码规范,不推荐使用。在实际开发中,建议按照标准的定义方式来定义结构体变量,即明确写明"struct"关键字。


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