C语言进阶学习3 struct、union、enum、sizeof、typedef分析

本文详细介绍了C语言中的struct、union、enum、sizeof和typedef,包括它们的使用、意义及特点。通过实例分析了空结构体在不同编译器下的行为,以及柔性数组的概念和应用。还探讨了union在大小端模式下的行为,并展示了枚举类型的用法。同时,解释了sizeof的计算规则和typedef的作用。
摘要由CSDN通过智能技术生成

本博客记录狄泰学院课程的学习
学习交流群:320628659
个人QQ:1367087622
欢迎大家交流学习
本章的学习目标:
struct和union还有enum, sizeof, typedef 的学习分析
学习这些关键字的意义以及使用

struct、union、enum、sizeof、typedef

struct和union

struct(结构体类型)

  • 在C语言中的struct可以看作是变量的集合,管理一系列互相相关的变量.

  • struct中的每个数据成员用独立的存储空间,与union所有成员共享一片内存有所区别。

  • struct的问题:

    • 空结构体占用多少内存?

    • struct TS{ ⇒ sizeof(struct TS) = ?

      };

    既然好奇,那就用代码编译试试

//test.c
#include <stdio.h>

struct TS
{
   

};

int main()
{
   
    struct TS t1;
    struct TS t2;
    
    printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
    printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
    printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);
    
    return 0;
}

在gcc 4.4.5 编译器

结果为

delphi@delphi-vm:~$ gcc test.c
delphi@delphi-vm:~$ ./a.out
sizeof(struct TS) = 0
sizeof(t1) = 0, &t1 = 0xbfb8ca20
sizeof(t2) = 0, &t2 = 0xbfb8ca20

在VC10.0 编译器

结果为

E:\> cl test.c

E:\> test.c <7> : error :C requires that a struct or union has at least one number

错误信息表明 在C语言中的struct 和 union 最少要有1个成员。

这两种现象都是对的,因为一个空的结构体没有任何意义,在历史上也没有规定到底是该选择哪种处理方式,所以这两者编译器的处理都是正确的

结构体与柔性数组
  • 柔性数组即数组大小待定的数组

  • C语言中可以由结构体产生柔性数组

  • C语言中结构体的最后一个元素可以是大小未知的数组

    struct SoftArray

    {

    ​ int len; ⇒ sizeof(struct SoftArray) = ???

    ​ int array[];

    };

    SoftArray中的array只是待使用的标识符并不占用内存空间

上代码

#include <stdio.h>
struct SoftArray
{
   
    int len;
    int array[];
};

int main()
{
   
    printf("sizeof(struct SoftArray )= %d\n", sizeof(struct SoftArray));
    return 0;
}

结果为

delphi@delphi-vm:~$ gcc test.c
delphi@delphi-vm:~$ ./a.out
sizeof(struct SoftArray )= 4

结果很明显只有int len的大小,那么该怎么使用柔性数组呢&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值