中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

C之struct和union(十)-創新互聯

    在 C 語言中我們經常會使用到 struct 和 union,那么它們兩個各自有何特點呢?今天我們就一探究竟。

公司專注于為企業提供成都網站建設、成都網站設計、微信公眾號開發、電子商務商城網站建設,微信小程序定制開發,軟件按需求定制網站等一站式互聯網企業服務。憑借多年豐富的經驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創意性的商業解決方案,成都創新互聯公司更提供一系列網站制作和網站推廣的服務。

        我們先來介紹下 struct 。它可以看做是變量的集合,那么一個空的結構體占多大內存呢?這是一個有趣的問題,按照理論分析,它應該是0。但是按照 C 語言的設計思想來說,不可能存在空結構體的,定義一個空結構體沒意義啊,所以應該報錯的。下來我們就分別在 gcc 和 BCC 編譯器上實驗下。由于代碼比較簡單,就不貼代碼了,我們直接來結果。圖一為在 gcc 編譯器下編譯的,圖二為在 BCC 編譯器下編譯的。

C之 struct 和 union(十)

                                             圖一


C之 struct 和 union(十)

                                                        圖二


        那么我們可以看到在 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。那么這個可以編譯通過嗎?如果可以,它的大小又會是多少呢?我們來看看結果:

C之 struct 和 union(十)

        我們可以看到編譯器并沒有報錯,也就證明是可以這樣定義的,并且它的大小為 4 。這說明數組 array 并沒有占用內存。下來我們來介紹下柔性數組的用法,如下圖所示

C之 struct 和 union(十)

        我們來使用下柔性數組,代碼如下:

#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之 struct 和 union(十)

        我們已經成功實現了一個柔性數組,可以自己指定這個數組的大小了。


        下來我們來介紹下 C 語言中的 union,它在語法上跟 struct 很像。但是 union 只分配大的成員變量的空間,所有成員共享這個空間。union 的使用受系統大小端的影響,我們來看看系統的大小端內存是怎樣分配的,如下圖所示:

C之 struct 和 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;
}

        我們編譯后結果如下:

C之 struct 和 union(十)

        那么我們本節學習了 struct 和 union 的有關特性,通過本節學習,總結如下:1、struct 中每個數據成員有獨立的存儲空間,可以通過最后的數組標識符產生柔性數組;2、union 中所有的數據成員共享同一個存儲空間,同時它的使用會受到系統大小端的影響。后面我們會繼續對 C 語言的學習。

         歡迎大家一起來學習 C 語言,可以加我QQ:243343083。


另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

文章名稱:C之struct和union(十)-創新互聯
網頁鏈接:http://www.2m8n56k.cn/article38/djjhsp.html

成都網站建設公司_創新互聯,為您提供網站策劃定制開發App設計品牌網站設計企業網站制作用戶體驗

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站建設
主站蜘蛛池模板: 久久se精品一区精品二区 | 亚洲天堂在线观看视频 | 香蕉香蕉国产片一级一级毛片 | 91不卡在线精品国产 | 久久精品国产午夜伦班片 | 欧美日韩中文字幕在线观看 | 4455四色永久免费 | 激情6月丁香婷婷色综合 | 综合成人在线 | 美女把张开腿男生猛戳免费视频 | 亚洲国产精品热久久2022 | 日本wwxx色视频| 国产成人a大片大片在线播放 | 国产偷自拍 | 国产成人亚洲综合网站不卡 | 在线观看国产精品入口 | 国产精品久久久久国产精品 | 亚洲欧美视频在线 | 三级视频中文字幕 | 亚洲国产成人久久一区二区三区 | av毛片免费看 | 99精品在线免费观看 | 久久精品综合 | 国产精品久久久久亚洲 | 成人欧美在线观看 | 欧美特欧美特级一片 | 成人区精品一区二区不卡亚洲 | hdxxx色视频| 日韩黄色片在线观看 | 最新理论三级中文在线观看 | 成人免费久久精品国产片久久影院 | 青久草视频 | 欧美精品一区二区在线观看 | 99久久精品免费看国产一区二区 | 国产第一页在线观看 | 久久99国产乱子伦精品免费 | 美女国产在线观看免费观看 | 亚洲第一区香蕉_国产a | 久久成人精品视频 | 美女精品永久福利在线 | 欧美综合自拍亚洲综合百度 |