0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你是否真的了解結(jié)構(gòu)體占用了多少字節(jié)?

信盈達(dá) ? 2024-06-04 08:04 ? 次閱讀

結(jié)構(gòu)體成員所占內(nèi)存空間大小

fd536da6-2205-11ef-bd4a-92fbcf53809c.png

一般情況下,如果想知道結(jié)構(gòu)體成員的內(nèi)存占用情況需要:

1、先用結(jié)構(gòu)體在內(nèi)存中開空間

2、使用sizeof(結(jié)構(gòu)體變量.成員名)或者sizeof(結(jié)構(gòu)體指針->成員名)的形式獲取成員在內(nèi)存中所占空間大小,舉例如下:

#include#include
typedef struct{ int id; char ch;}data;
int main(){ data a; // 結(jié)構(gòu)體變量 data *p = (data *)malloc(sizeof(data));
// 結(jié)構(gòu)體變量用點(diǎn)語法 printf("方式一:成員id大?。?d,ch大?。?d\n", sizeof(a.id),sizeof(a.ch));
// 結(jié)構(gòu)體指針用 -> printf("方式二:成員id大?。?d,ch大?。?d\n", sizeof(p->id),sizeof(p->ch));
return 0;}

此方法需要在內(nèi)存中開辟空間。

fd56d5c2-2205-11ef-bd4a-92fbcf53809c.png

在閱讀源碼的時(shí)候偶然發(fā)現(xiàn)了一種非常妙的寫法:可以將結(jié)構(gòu)體指針強(qiáng)制指向地址為0的區(qū)域,然后直接用sizeof訪問成員。

printf("方法三:成員id大?。?d,ch大小:%d\n", sizeof(((data *)0)->id),sizeof(((data *)0)->ch));

地址為0的區(qū)域?yàn)楸A魠^(qū),程序運(yùn)行時(shí)并不會(huì)真正在內(nèi)存中開空間,這里可以理解為借用了0值。

為了通用,可以將這種方法進(jìn)行宏定義:

#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)

Struct --- 結(jié)構(gòu)體類型名字

Attribute--- 結(jié)構(gòu)體成員名測試代碼如下,你也快去試一下吧!

#include#include
#define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
typedef struct{ int id; char ch;}data;
typedef struct{ double d; short m;}data2;
int main(){ printf("%d\n",size_of_attribute(data,ch)); printf("%d\n",size_of_attribute(data2,d)); return 0;}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2947

    瀏覽量

    73730
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    630

    瀏覽量

    29074
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10812
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    字節(jié)豆包推出AI智能耳機(jī)

    字節(jié)跳動(dòng)旗下豆包品牌近日推出了其首款A(yù)I智能耳機(jī)——Ola Friend。這款耳機(jī)采用了開放式設(shè)計(jì),單耳重量僅為6.6克,佩戴舒適輕盈。
    的頭像 發(fā)表于 10-10 16:55 ?388次閱讀

    認(rèn)識(shí)貼片電阻嗎,對(duì)他了解多少?

    認(rèn)識(shí)貼片電阻嗎,對(duì)他了解多少?
    的頭像 發(fā)表于 08-27 15:49 ?255次閱讀
    <b class='flag-5'>你</b>認(rèn)識(shí)貼片電阻嗎,<b class='flag-5'>你</b>對(duì)他<b class='flag-5'>了解</b>多少?

    真的了解駐波比嗎?到底什么是電壓駐波比?

    真的了解駐波比嗎?到底什么是電壓駐波比?在很長一段時(shí)間內(nèi),小編對(duì)駐波比的了解僅限于這樣一個(gè)概念:它是一個(gè)用于描述波反射大小的物理量,取值范圍[1, ∞],值越小,就表示反射越小,值越
    的頭像 發(fā)表于 05-29 14:27 ?2843次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>駐波比嗎?到底什么是電壓駐波比?

    用FreeRTOS使用隊(duì)列怎么發(fā)送一個(gè)結(jié)構(gòu)呢?

    怎么使用隊(duì)列,發(fā)送一個(gè)12個(gè)字節(jié)結(jié)構(gòu)呢? osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec
    發(fā)表于 04-17 07:35

    MCAL的DMA如何使得變量存儲(chǔ)由編譯器自動(dòng)分配 ?

    (DMA_START_SEC_CONFIG_DATA_ASIL_B_CORE0_256),但是Dma_kChannel_40_TcsConfigRoot結(jié)構(gòu)實(shí)際只占用16個(gè)字節(jié),請(qǐng)問
    發(fā)表于 02-02 08:33

    經(jīng)典 C 語言編程,結(jié)構(gòu)和聯(lián)合體如何共用?

    結(jié)構(gòu) 結(jié)構(gòu)占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,
    的頭像 發(fā)表于 01-11 18:24 ?1161次閱讀
    經(jīng)典 C 語言編程,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和聯(lián)合體如何共用?

    結(jié)構(gòu)與指針的關(guān)系

    在C語言中,結(jié)構(gòu)(Struct)是一種用戶自定義的數(shù)據(jù)類型,它允許您將不同類型的數(shù)據(jù)項(xiàng)組合在一起,以便形成一個(gè)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)可以
    的頭像 發(fā)表于 01-11 08:00 ?868次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>與指針的關(guān)系

    keil arm工程中結(jié)構(gòu)1字節(jié)對(duì)齊如何實(shí)現(xiàn)

    在Keil Arm工程中,結(jié)構(gòu)的對(duì)齊方式可以通過使用特定的編譯器指令或者關(guān)鍵字來實(shí)現(xiàn)。結(jié)構(gòu)的對(duì)齊方式會(huì)直接影響結(jié)構(gòu)
    的頭像 發(fā)表于 01-05 14:40 ?3103次閱讀

    RFID和NFC之間的那些事兒,真的了解嗎?

    RFID和NFC之間的那些事兒,真的了解嗎?
    的頭像 發(fā)表于 12-15 09:38 ?1144次閱讀
    RFID和NFC之間的那些事兒,<b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>了解</b>嗎?

    作為射頻工程師,真的會(huì)用“dB”?

    作為射頻工程師,真的會(huì)用“dB”?
    的頭像 發(fā)表于 12-06 14:51 ?497次閱讀
    作為射頻工程師,<b class='flag-5'>你</b><b class='flag-5'>真的</b>會(huì)用“dB”?

    真的能區(qū)別int(1)和int(10)的應(yīng)用?

    我們知道在mysql中 int占4個(gè)字節(jié),那么對(duì)于無符號(hào)的int,最大值是2^32-1 = 4294967295,將近40億,難道用了int(1),就不能達(dá)到這個(gè)最大值嗎?
    的頭像 發(fā)表于 12-06 14:43 ?468次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>真的</b>能區(qū)別int(1)和int(10)的應(yīng)用?

    了解PWM“死區(qū)”嗎?

    了解PWM“死區(qū)”嗎?
    的頭像 發(fā)表于 11-24 16:47 ?887次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>了解</b>PWM“死區(qū)”嗎?

    嵌套的結(jié)構(gòu) 字節(jié)是如何對(duì)齊的

    嵌套的結(jié)構(gòu),字節(jié)又是如何對(duì)齊的呢 先來看下面的代碼 typedef struct stu1 { char ary [ 5 ] ; int a; }stu1; typedef struct stu2
    的頭像 發(fā)表于 11-20 16:01 ?468次閱讀
    嵌套的<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b> <b class='flag-5'>字節(jié)</b>是如何對(duì)齊的

    什么是結(jié)構(gòu)字節(jié)對(duì)齊現(xiàn)象

    什么是結(jié)構(gòu)字節(jié)對(duì)齊現(xiàn)象 程序員,咱都用代碼說話,先上 code: (說明:以下代碼均在 ARM 平臺(tái)上,使用 Keil 進(jìn)行編譯測試) # define offset_of (TYPE
    的頭像 發(fā)表于 11-20 15:55 ?529次閱讀
    什么是<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>的<b class='flag-5'>字節(jié)</b>對(duì)齊現(xiàn)象

    為什么我定義的結(jié)構(gòu)不能用--&gt;來調(diào)用結(jié)構(gòu)的元素?

    結(jié)構(gòu)代碼部分 typedef unsigned int uint_32t; typedef unsigned short uint_16t; typedef struct { uint_32t
    發(fā)表于 11-11 19:06