10_struct和union分析

关键词:struct、结构体与柔性数组、union、小端模式和大端模式

1. struct的小秘密

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

// 定义一个空结构体
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编译器下能够编译通过,输出结果为:

sizeof(struct TS) = 0
sizeof(t1) = 0, &t1 = 0xbfe7a740
sizeof(t2) = 0, &t2 = 0xbfe7a740

在bcc编译器和vs编译器下,编译报错,不支持空结构体

2. 结构体与柔性数组

  • 柔性数组数组大小待定的数组
  • C语言中可以由结构体产生柔性数组
  • C语言中结构体的最后一个元素可以时大小未知的数组
    语法格式:
struct SoftArray
{
    int len;
    int array[];  // 仅仅为一个标识符,不占用存储空间
};
#include 

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


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

    return 0;
}

输出结果:

4

3. 柔性数组的用法

#include 
#include 

// 通过结构体定义柔性数组
struct SoftArray
{
    int len;
    int array[];
};

// 创建柔性数组
struct SoftArray* create_soft_array(int n)
{
    struct SoftArray* ret = NULL;
    
    if( n > 0 )
    {
        ret = (struct SoftArray*)malloc( sizeof(struct SoftArray) + sizeof(int) * n );
        
        ret->len = n;
    }
    
    return ret;
}

// 释放内存空间
void delete_soft_array(struct SoftArray* sa)
{
    free(sa);
}

// 使用柔性数组
void use_soft_array(struct SoftArray* sa)
{
    if( sa != NULL )
    {
        for(int i=0; ilen; i++)
        {
            sa->array[i] = i + 1;
        }
    }
}


int main()
{
    struct SoftArray* sa = create_soft_array(5);
    
    use_soft_array(sa);
    
    for(int i=0; ilen; i++)
    {
        printf("%d\n", sa->array[i]);
    }
    
    delete_soft_array(sa);

    return 0;
}

输出结果:

1
2
3
4
5

4. C语言中的union

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

struct A
{
    int a;
    int b;
    int c;
};

union B
{
    int a;
    int b;
    int c;
};


int main()
{
    printf("sizeof(struct A) = %d\n", sizeof(struct A));
    
    printf("sizeof(union B) = %d\n", sizeof(union B));

    return 0;
}

输出结果:

sizeof(struct A) = 12
sizeof(union B) = 4

5. 小端模式和大端模式

  • 小端模式下,低地址存储低位数据
  • 大端模式下,高地址存储低位数据
10_struct和union分析_第1张图片

6. union的注意事项

  • union的使用受系统大小端的影响
void system_mode()
{
    union SM
    {
        int i;
        char c;
    };
    
    union SM sm;
    
    sm.i = 1;
    
    if( 1 == sm.c )
    {
        printf("This system is Small Endian\n");
    }
    else
    {
        printf("This system is Big Endian\n");
    }
}

7. 小结

  • struct中的每个数据成员有独立的存储空间
  • union中的所有成员共享一个存储空间
  • struct可以通过最后的数组标识符产生柔性数组
  • union的使用受到系统大小端的影响

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

你可能感兴趣的:(10_struct和union分析)