国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲

這篇具有很好參考價值的文章主要介紹了C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在上一篇文章中,我們學習了枚舉位段聯(lián)合體的相關(guān)內(nèi)容,在文章的末尾,我們還差了關(guān)于聯(lián)合體的存儲問題的內(nèi)容,今天我們將學習該部分的內(nèi)容,好了,話不多說,開整?。?!

結(jié)構(gòu)體的存儲方式

結(jié)構(gòu)體在內(nèi)存中是如何存儲的呢,是按里面的變量內(nèi)容,在內(nèi)存中的連續(xù)地址中存儲還是如何呢,我們先看以下代碼:

#include<stdio.h>
struct test
{
    int a;
    char b;
    char c;
};
int main()
{
    struct test tes;
    printf("%d\n",sizeof(tes));
    return 0;
}

大家猜猜結(jié)果是多少呢?是不是6呢,又或是其他,我們編譯查看結(jié)果:
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
8是怎么來的呢,我們下面進行講解。

對齊原則

實際上,結(jié)構(gòu)體在內(nèi)存中的對齊方式遵循以下的規(guī)則

1、第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處
2、其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。
3、結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍
4、如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍,

對齊數(shù)

在上述的第二條原則中,我們提到了對齊數(shù)的概念,所謂的的對齊數(shù)

對齊數(shù)=編譯器默認的一個對齊數(shù)與該成員大小的較小值

也就是在不同的編譯器中,對齊數(shù)是不太一樣的,以vscode為例,其默認對齊數(shù)為8;

在了解了對齊原則對齊數(shù)之后,我們再分析上述代碼的結(jié)果8是如何得到的,分析過程如下圖,圖中標注較為清晰,不再贅述:
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
上述代碼是在結(jié)構(gòu)體中先定義1個整型,然后定義兩個字符變量,如果先定義兩個字符變量再定義整型變量結(jié)果會不會有區(qū)別呢,代碼如下:

#include<stdio.h>
struct test
{
    char b;
    char c; 
    int a;
};
int main()
{
    struct test tes;
    printf("%d\n",sizeof(tes));
    return 0;
}

編譯結(jié)果如下:
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
可以發(fā)現(xiàn)結(jié)果仍為8,不在此處進行分析,我們分析最后一種情況:定義一個字符變量、然后定義整型,然后再定義字符變量,代碼如下:

#include<stdio.h>
struct test
{
    char b;
    char c; 
    int a;
};
int main()
{
    struct test tes;
    printf("%d\n",sizeof(tes));
    return 0;
}

2023/07/04 修改:上述代碼應該為:

#include<stdio.h>
struct test
{
    char b;
    int a;
    char c; 
};
int main()
{
    struct test tes;
    printf("%d\n",sizeof(tes));
    return 0;
}

我們先分析,然后查看結(jié)果,分析過程如下:
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
我們查看結(jié)果,發(fā)現(xiàn)確實為12個字節(jié)

C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
通過上述兩道題目的分析,我想你一定掌握了結(jié)構(gòu)體在內(nèi)存中的存放方式,此外我們也發(fā)現(xiàn)一個問題:

定義相同內(nèi)容的結(jié)構(gòu)體,定義的順序不同,占用的空間大小也不同。

因此在定義結(jié)構(gòu)體時,如何定義最好呢,我們推薦:

變量大小中,成員較小的放在前面定義,大小中較大的放在后面定義

因為這樣可以節(jié)省內(nèi)存空間。

聯(lián)合體的大小

昨天沒有講解聯(lián)合體的大小是因為該部分內(nèi)容涉及到對齊數(shù)的知識,今天可以講解了,聯(lián)合體的大小遵循以下的原則:

1、聯(lián)合體的大小至少為整個內(nèi)容中最大的變量的大小
2、當最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。

我們使用以下代碼查看聯(lián)合體的大?。?/p>

#include<stdio.h>
union test
{
    int a ;
    char b;
    char c[20];
};
int main()
{
    union test tes;
    printf("%d\n",sizeof(tes));
    return 0;
}

聯(lián)合體中,對齊數(shù)分別為4 1 1 ,因此最大對齊數(shù)為4,聯(lián)合體中的最大大小為20,也是最大對齊數(shù)4的倍數(shù),因此結(jié)果應該為20,
查看結(jié)果:
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
可以看到大小為20個字節(jié),并不是 4+1+20 = 25字節(jié),我們將c的改為3字節(jié),再查看結(jié)果
C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲,C語言學習,c語言,學習,開發(fā)語言
這個就交給大家自行分析嘍。

上述內(nèi)容即使今天的全部內(nèi)容了,感謝大家的觀看。
如果方便,辛苦大家點個贊和關(guān)注哦!
您的點贊或評論或關(guān)注是對我最大的肯定,謝謝大家!?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-518444.html

到了這里,關(guān)于C語言學習(三十一)---結(jié)構(gòu)體、聯(lián)合體的在內(nèi)存中的存儲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【C語言】一篇文章深入解析聯(lián)合體和枚舉且和結(jié)構(gòu)體的區(qū)別

    【C語言】一篇文章深入解析聯(lián)合體和枚舉且和結(jié)構(gòu)體的區(qū)別

    聯(lián)合體( union )是允許一個變量通過不同的接口訪問內(nèi)存的一種數(shù)據(jù)類型,表示一個變量可以存儲不同類型的值,而枚舉是使用 enum 定義一組相關(guān)且互斥的整形常量集合。本章阿森將和你學習聯(lián)合體類型的聲明,特點,有關(guān)大小的計算,還有枚舉類型的聲明,優(yōu)點和使

    2024年02月03日
    瀏覽(23)
  • 一篇博客學會系列(2)—— C語言中的自定義類型 :結(jié)構(gòu)體、位段、枚舉、聯(lián)合體

    一篇博客學會系列(2)—— C語言中的自定義類型 :結(jié)構(gòu)體、位段、枚舉、聯(lián)合體

    目錄 ?前言 1、結(jié)構(gòu)體 1.1、結(jié)構(gòu)體類型的聲明 1.2、特殊的結(jié)構(gòu)體類型聲明 1.3、結(jié)構(gòu)體的自引用 1.4、結(jié)構(gòu)體的定義和初始化 1.5、結(jié)構(gòu)體成員變量的調(diào)用 1.6、結(jié)構(gòu)體內(nèi)存對齊? 1.6.1、offsetof 1.6.2、結(jié)構(gòu)體大小的計算 1.6.3、為什么存在內(nèi)存對齊?? 1.7、?修改默認對齊數(shù) 1.8、結(jié)構(gòu)

    2024年02月08日
    瀏覽(29)
  • 聯(lián)合體(C語言)

    聯(lián)合體(C語言)

    小伙伴們又來學習知識啦~,今天我要給大家介紹一下聯(lián)合體的使用,話不多說,我們開始今天的正題吧! 聯(lián)合體的介紹 C語言的聯(lián)合體(union)是一種特殊的數(shù)據(jù)類型,它可以在同一內(nèi)存空間中存儲不同的數(shù)據(jù)類型。與結(jié)構(gòu)體類似,聯(lián)合體也可以定義多個成員,但是這些成員

    2024年02月04日
    瀏覽(42)
  • 自定義類型:結(jié)構(gòu)體、枚舉、聯(lián)合體

    自定義類型:結(jié)構(gòu)體、枚舉、聯(lián)合體

    結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它由多個不同類型的成員變量組成,結(jié)構(gòu)體可以將多個相關(guān)的數(shù)據(jù)打包在一起,方便進行管理和處理。 定義形式: struct 結(jié)構(gòu)體名{ 類型 成員名1; 類型 成員名2; //更多的成員變量 }; 如描述一個學生: struct Stu這樣就和int類型一樣,都是數(shù)

    2024年02月16日
    瀏覽(29)
  • 結(jié)構(gòu)體和聯(lián)合體嵌套訪問

    在JSON項目中,使用了聯(lián)合體和結(jié)構(gòu)體之間的嵌套,但是在訪問內(nèi)部的聯(lián)合體和結(jié)構(gòu)體的時候出現(xiàn)了問題,這篇文章作為記錄,也希望能幫助遇到相同問題的好伙伴。 上面是最原始的代碼,上面的代碼可以通過下面的代碼訪問double n和lept_type type, 但是無法訪問str結(jié)構(gòu)體內(nèi)部的

    2024年02月07日
    瀏覽(17)
  • 【C語言】聯(lián)合體和枚舉

    【C語言】聯(lián)合體和枚舉

    前言 這篇博客就把剩下的兩個自定義類型聯(lián)合體和枚舉好好總結(jié)一下,讓我們好好看看聯(lián)合體和枚舉到底是什么 個人主頁:小張同學zkf 若有問題 評論區(qū)見 感興趣就關(guān)注一下吧 目錄 ?1. 聯(lián)合體 1.1 聯(lián)合體類型的聲明 ?1.2 聯(lián)合體的特點 ?1.3 相同成員的結(jié)構(gòu)體和聯(lián)合體對比 ?

    2024年04月14日
    瀏覽(28)
  • c語言-聯(lián)合體和枚舉

    c語言-聯(lián)合體和枚舉

    (1) 像結(jié)構(gòu)體?樣,聯(lián)合體也是由一個或者多個成員構(gòu)成,這些成員可以不同的類型。 (2)但是編譯器只為最大的成員分配足夠的內(nèi)存空間。聯(lián)合體的特點是所有成員共用同一塊內(nèi)存空間。所以聯(lián)合體也叫:共用體。 (3) 給聯(lián)合體其中?個成員賦值,其他成員的值也跟著

    2024年02月04日
    瀏覽(19)
  • c語言-枚舉和聯(lián)合體

    c語言-枚舉和聯(lián)合體

    本篇文章介紹c語言中的枚舉類型和聯(lián)合體類型 枚舉類型和結(jié)構(gòu)體類型相似,都是一種自定義類型。 定義枚舉類型的: enum 枚舉類型的定義格式 例如,定義一個星期作為枚舉類型 枚舉類型的第一個成員的取值默認為0,依次往后遞增1, 輸出枚舉WEEK每個成員的值 修改枚

    2024年01月21日
    瀏覽(24)
  • C語言枚舉與聯(lián)合體詳解

    C語言枚舉與聯(lián)合體詳解

    ? ? 本篇文章帶來 枚舉與聯(lián)合體 相關(guān)知識詳細講解! 如果您覺得文章不錯,期待你的一鍵三連哦,你的鼓勵是我創(chuàng)作的動力之源,讓我們一起加油,一起奔跑,讓我們頂峰相見?。。?目錄 一.枚舉 1.什么是枚舉? 2.枚舉類型的定義 3.枚舉的優(yōu)點 4.枚舉的使用 二.聯(lián)合體(共

    2024年02月15日
    瀏覽(21)
  • 【C語言】自定義類型——枚舉、聯(lián)合體

    【C語言】自定義類型——枚舉、聯(lián)合體

    對枚舉、聯(lián)合體進行介紹,包括枚舉的聲明、枚舉的優(yōu)點,聯(lián)合體的聲明、聯(lián)合體的大小。 ? ? ? ? ? ? ? ? ??? 豬巴戒 :個人主頁? ??????????????? 所屬專欄 :《C語言進階》 ? ? ? ? ?? 跟著豬巴戒 ,一起學習C語言?? 目錄 引言 枚舉 枚舉的優(yōu)點 聯(lián)合(共用體

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包