• C语言进阶——struct和union分析10


    struct的小秘密:

    • C语言中的struct可以看作变量的集合
    • struct的问题:空结构体占用多大内存呢?

    程序实例1:

    #include <stdio.h>
    
    struct TS
    {
    
    };
    
    int main()
    {
        struct TS t1;
        struct TS t2;
        
        printf("sizeof(struct TS) = %d
    ", sizeof(struct TS));
        printf("sizeof(t1) = %d, &t1 = %p
    ", sizeof(t1), &t1);
        printf("sizeof(t2) = %d, &t2 = %p
    ", sizeof(t2), &t2);
        
        return 0;
    }

    对于空结构体这个概念不同的编译器可能做出的选择不一样:

    • 像gcc,codeblocks,vs这种编译器可以接受空结构体,不会报错
    • 像vc和bcc编译器就不能接受空结构体这种概念
    • 对于空结构体这个概念,是一个灰色地带,不存在哪种编译器做出的选择更加正确

    结构体与柔数组:

    • 柔性数组即数组大小待定的数组
    • C语言可以由结构体产生柔性数组
    • C语言结构体中的最后一个元素可以是大小未知的数组

    程序示例2:

    struct SoftArray
    {
        int len;
        int array[];
    };

    那么就有一个问题了,sizeof(struct SoftArray);的大小是多少呢?SoftArray 中的array仅是一个待定使用的标识符,不占用存贮空间

    程序示例3:(柔性数组的用法)

    struct SoftArray
    {
        int len;
        int array[];
    };
    //......
    struct SoftArray sa;
    sa =(struct SoftArray *)malloc(sizeof(struct SoftArray)+sizeof(int)*5);
    
    sa->len=5;

    这只是一个代码片段,定义了一个int类型的柔性数组,长度为5

    程序示例4:

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 
     4 struct SoftArray
     5 {
     6     int len;
     7     int array[];
     8 };
     9 
    10 struct SoftArray* create_soft_array(int size)
    11 {
    12     struct SoftArray* ret = NULL;
    13     
    14     if( size > 0 )
    15     {
    16         ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
    17         
    18         ret->len = size;
    19     }
    20     
    21     return ret;
    22 }
    23 
    24 void delete_soft_array(struct SoftArray* sa)
    25 {
    26     free(sa);
    27 }
    28 
    29 void func(struct SoftArray* sa)
    30 {
    31     int i = 0;
    32     
    33     if( NULL != sa )
    34     {
    35         for(i=0; i<sa->len; i++)
    36         {
    37             sa->array[i] = i + 1;
    38         }
    39     } 
    40 }
    41 
    42 int main()
    43 {
    44     int i = 0;
    45     struct SoftArray* sa = create_soft_array(10);
    46     
    47     func(sa);
    48     
    49     for(i=0; i<sa->len; i++)
    50     {
    51         printf("%d
    ", sa->array[i]);
    52     }
    53     
    54     delete_soft_array(sa);
    55     
    56     return 0;
    57 }

    定义了一个柔性数组,并且给它赋值,然后将值打印出来,大佬们自己看一下,我相信你们用眼睛瞟一下就懂了,嘻嘻。

    C语言中的union:

    • C语言中的union在语法上和struct相似
    • union只分配最大成员的空间,所有成员共享这个空间

    union的注意事项:union的使用受系统大小端的影响,大小端是什么意思呢,我就用一段代码给大家介绍一下

    程序示例5:

    union C
    {
        int i;
        char c;
    };
    
    union C c;
    c.i=1;
    printf("%d
    ",c.c);  //?

    这段代码片段会打印什么呢,需要和我们的系统来决定:

    小端模式:会从低地址到高地址来存贮这个1,也就是我们平常习惯的方式,因为打印的时候就是从低地址读取到高地址,,所以会打印出来1

    大端模式:会从高地址到低地址来存贮这个1,也就是说这个1存贮在高位,由于打印的时候是从低位读取打印,所以会打印0

    注意:这段代码其实很巧妙,我们给c里面的i(int类型  四个字节),然后打印c里面的的c(char类型),大家自己好好体会一下

    程序示例6:(判断自己的系统是哪种模式)

    #include <stdio.h>
    
    int system_mode()
    {
        union SM
        {
            int i;
            char c;
        };
    
        union SM sm;
        
        sm.i = 1;
        
        return sm.c;
    }
    
    
    int main()
    {
        printf("System Mode: %d
    ", system_mode());
        return 0;
    }

    如果输出为1,那么就是小端模式,如果输出为0,那么就是大端模式

    小结:

    • struct中的每个数据成员具有独立的存贮空间
    • struct可以通过最后的数组标识符产生柔性数组
    • union中的所有数据成员共享一个存贮空间
    • union的使用会受到系统大小端的影响
  • 相关阅读:
    Linux开机启动和用户登录启动配置 .
    配置ssh信任
    .bash_profile和.bashrc的区别(如何设置生效)
    HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
    一个shell写的urldecode代码
    用 DomIt! 做简单的 XML 处理工作
    windows主机安全设置 PHP5研究室
    介绍几个测试虚拟主机性能的工具 测速(全球范围),测同服网站,测路由
    Dreamhost开启allow_url_fopen采集功能教程
    配置Editplus的PHP调试环境
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9233730.html
Copyright © 2020-2023  润新知