【C】 10_Struct 和 union

struct 的小祕密


  • C 語言中的 srtuct 能夠看做變量的集合

struct 的問題 : 空結構體佔用多大內存?編程

void code()
{
    struct TS
    {
    };
    
    printf("%d\n", sizof(struct TS));
}

實例分析: 空結構體的大小

#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\n", sizeof(t1), &t1);
    printf("sizeof(t2) = %d\n", sizeof(t1), &t2);

    return 0
}
輸出:【GCC】
sizeof(struct TS) = 0
sizeof(t1) = 0
sizeof(t2) = 0

C 語言的灰色地帶:不一樣編譯器有不一樣的行爲數組

  • GCC 大小爲 0
  • BCC, VC 報錯

結構體與柔性數


柔性數組的用法

struct SoftArray
{
    int len;
    int array[];  // 當且僅看成爲結構體的最後一個元素時能夠使用
};
// ...

struct SoftArray* sa = NULL;
sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * 5));
sa->len = 5;

printf("%d\n", sizeof(struct SoftArray));  // 4

clipboard.png

實例分析:柔性數組使用分析

#include <stdio.h>
#include <malloc.h>

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

struct SoftArray* creat_soft_array(int size)
{
    struct SoftArray* ret = NULL;
    
    if( size > 0 )
    {
        ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
        
        ret->len = size; 
    }
    
    return ret;
}

void delete_soft_array(struct SoftArray* sa)
{
    free(sa);
}

void func(struct SoftArray* sa)
{
    int i = 0;
    
    if( sa != NULL )
    {
        for(i=0; i<sa->len; i++)
        {
            sa->array[i] = i + 1;
        }
    }
}

int main()
{
    int i = 0;
    struct SoftArray* sa = creat_soft_array(10);
    
    func(sa);
    
    for(i=0; i<sa->len; i++)
    {
        printf("%d\n", sa->array[i]);
    }
    
    delete_soft_array(sa);

    return 0;
}
輸出:
1
2
3
4
5
6
7
8
9
10

C語言中的 union


  • C 語言中的 union 在語法上與 struct 類似
  • union 只分配最大成員的空間,全部成員共享這個空間
void code_1()
{
    struct A
    {
        int a;
        int b;
        int c;
    }
    
    printf("%d\n", sizeof(struct A));  // 12
}

void code_2()
{
    union B
    {
        int a;
        int b;
        int c;
    }
    
    printf("%d\n", sizeof(union B));   // 4
}

union 的注意事項


  • union 的使用受系統大小端的影響spa

    • 小端,低字節在低地址
    • 大端,低字節在高地址

clipboard.png

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

編程實驗: 判斷系統的大小端

int system_mode()
{
    union SM
    {
        int i;
        char c;
    };
    
    union SM sm;
    
    sm.i = 1;
    
    return sm.c;
}

int main()
{
    printf("System Mode: %d\n", system_mode());
    
    return 0;
}
輸出:低字節在低地址,小端
System Mode: 1

小結


  • strut 中的每一個數據成員有獨立的存儲空間
  • strut 能夠經過最後的數組標識符產生柔性數組
  • union 中的全部數據成員共享一個存儲空間
  • union 的使用會受到系統大小端的一影響

以上內容參考狄泰軟件學院系列課程,請你們保護原創!code

相關文章
相關標籤/搜索