您好,登錄后才能下訂單哦!
在 C 語言中我們經常會使用到 struct 和 union,那么它們兩個各自有何特點呢?今天我們就一探究竟。
我們先來介紹下 struct 。它可以看做是變量的集合,那么一個空的結構體占多大內存呢?這是一個有趣的問題,按照理論分析,它應該是0。但是按照 C 語言的設計思想來說,不可能存在空結構體的,定義一個空結構體沒意義啊,所以應該報錯的。下來我們就分別在 gcc 和 BCC 編譯器上實驗下。由于代碼比較簡單,就不貼代碼了,我們直接來結果。圖一為在 gcc 編譯器下編譯的,圖二為在 BCC 編譯器下編譯的。
圖一
圖二
那么我們可以看到在 gcc 編譯器中,它支持我們的第一種看法,即認為占0個字節的內存。但是在 BCC 編譯器中,它認為這樣是不合法的,定義空結構體根本沒必要,所以直接報錯了。
那么我們在 C 語言中定義一個組數時,平常情況下只能定義大小是固定的數組。有沒有什么辦法讓我們在 C 語言中定義一個動態大小的數組呢?辦法當然是有的,這時我們就要用到我們的 struct 了。我們可以利用 struct 來定義一個大小待定的數組,我們稱之為柔性數組。 在 C 語言中結構體的最后一個元素可以是大小未知的數組,那么在結構體中的數組便是一個待使用的標識符,并不占用存儲空間。不信嗎?我們來做個實驗,代碼如下:
#include <stdio.h> struct TS { int len; int array[]; }; int main() { printf("sizeof(struct TS) = %d\n", sizeof(struct TS)); return 0; }
我們先來分析下這個代碼,結構體 TS 中定義了一個 int 類型的變量 len,還有個大小未知的數組 array。那么這個可以編譯通過嗎?如果可以,它的大小又會是多少呢?我們來看看結果:
我們可以看到編譯器并沒有報錯,也就證明是可以這樣定義的,并且它的大小為 4 。這說明數組 array 并沒有占用內存。下來我們來介紹下柔性數組的用法,如下圖所示
我們來使用下柔性數組,代碼如下:
#include <stdio.h> #include <malloc.h> struct SoftArray { int len; int array[]; }; struct SoftArray* create_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_SoftArray(struct SoftArray* sa) { free(sa); } void func(struct SoftArray* sa) { int i = 0; if( NULL != sa ) { for(i=0; i<sa->len; i++) { sa->array[i] = i + 1; } } } int main() { int i = 0; struct SoftArray* sa = create_soft_array(5); func(sa); for(i=0; i<sa->len; i++) { printf("sa[%d] = %d\n", i, sa->array[i]); } delete_SoftArray(sa); return 0; }
我們來看下編譯后的結果
我們已經成功實現了一個柔性數組,可以自己指定這個數組的大小了。
下來我們來介紹下 C 語言中的 union,它在語法上跟 struct 很像。但是 union 只分配最大的成員變量的空間,所有成員共享這個空間。union 的使用受系統大小端的影響,我們來看看系統的大小端內存是怎樣分配的,如下圖所示:
那么在小端模式下,數據存儲在低位地址上。大端則相反,但是我們的程序取數據總是從低地址開始取的。在上圖中的程序中,如果系統是小端,則輸出為 1,反之則為 0。根據 union 這個特性,我們可以寫一個判斷系統大小端的函數。這道題也是筆試中我們經常會見到的,代碼如下:
#include <stdio.h> int System_mode() { union SM { int i; char c; }; union SM sm; sm.i = 1; return sm.c; } int main() { if( 1 == System_mode() ) { printf("小端模式\n"); } else { printf("大端模式\n"); } return 0; }
我們編譯后結果如下:
那么我們本節學習了 struct 和 union 的有關特性,通過本節學習,總結如下:1、struct 中每個數據成員有獨立的存儲空間,可以通過最后的數組標識符產生柔性數組;2、union 中所有的數據成員共享同一個存儲空間,同時它的使用會受到系統大小端的影響。后面我們會繼續對 C 語言的學習。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。