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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

信盈達 ? 2024-06-04 08:04 ? 次閱讀

結構體成員所占內存空間大小

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

一般情況下,如果想知道結構體成員的內存占用情況需要:

1、先用結構體在內存中開空間

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

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

此方法需要在內存中開辟空間。

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

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

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

地址為0的區(qū)域為保留區(qū),程序運行時并不會真正在內存中開空間,這里可以理解為借用了0值。

為了通用,可以將這種方法進行宏定義:

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

Struct --- 結構體類型名字

Attribute--- 結構體成員名測試代碼如下,你也快去試一下吧!

#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;}

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

    關注

    8

    文章

    3028

    瀏覽量

    74082
  • 源碼
    +關注

    關注

    8

    文章

    642

    瀏覽量

    29229
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10848
收藏 人收藏

    評論

    相關推薦

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大??? 答案是會的,這主要跟字節(jié)對齊有關。 比如這樣的
    的頭像 發(fā)表于 11-25 16:24 ?182次閱讀

    深度了解SiC的晶體結構

    SiC是由硅(Si)和碳(C)按1:1的化學計量比組成的晶體,因其內部結構堆積順序的不同,形成不同的SiC多型,本篇章帶你了解SiC的晶體結構及其可能存在的晶體缺陷。
    的頭像 發(fā)表于 11-14 14:57 ?707次閱讀
    深度<b class='flag-5'>了解</b>SiC的晶體<b class='flag-5'>結構</b>

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

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

    認識貼片電阻嗎,對他了解多少?

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

    【GD32 MCU 入門教程】六、GD32 MCU 選項字節(jié)設置及解除方法

    您在使用GD32過程中是否遇到過芯片反復復位,代碼無法更新,代碼一直執(zhí)行在0x1fffxxxx區(qū)域,或代碼執(zhí)行在SRAM區(qū)域的情況?如果有遇到這類現(xiàn)象是否找到原因呢?如果沒找到是否檢查過選項
    的頭像 發(fā)表于 08-26 09:43 ?639次閱讀
    【GD32 MCU 入門教程】六、GD32 MCU 選項<b class='flag-5'>字節(jié)</b>設置及解除方法

    知道一成型電感多少錢嗎

    知道一成型電感多少錢嗎 gujing 編輯:谷景電子 一成型電感是電子電路中特別重要的一種零件,大家在選擇一成型電感的時候都會比較重視它的價格!一
    的頭像 發(fā)表于 07-06 10:46 ?984次閱讀

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

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

    用FreeRTOS使用隊列怎么發(fā)送一個結構呢?

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

    C語言結構史上最詳細的講解【軟件干貨】

    struct結構數(shù)據類型 前言 我們知道,在C語言中有一些基本的數(shù)據類型,如?char?int?float?long?double?string(c99) 等等數(shù)據類型,他們可以表示一些事物
    的頭像 發(fā)表于 03-28 17:52 ?774次閱讀

    PSOC4的PWM輸出占用的IO引腳是否可以做普通GPIO口嗎?

    PSOC4在設置開啟PWM模塊應用占用某個IO引腳輸出,一段時間后,由于不需要PWM功能,計劃關掉PWM模塊,讓該占用的IO口做普通GPIO使用,是否可以實現(xiàn)?怎么實現(xiàn)?
    發(fā)表于 02-05 08:25

    MCAL的DMA如何使得變量存儲由編譯器自動分配 ?

    (DMA_START_SEC_CONFIG_DATA_ASIL_B_CORE0_256),但是Dma_kChannel_40_TcsConfigRoot結構實際只占用16個字節(jié),請問
    發(fā)表于 02-02 08:33

    求助,請問一個結構如何全部定義到 __attribute__ 區(qū)域?

    請問一個結構如何全部定義到 __attribute__ 區(qū)域? 例如我這里涉及到一些高速計算的緩存,計劃將緩存數(shù)據存儲到 __attribute__ 區(qū)域。 三個結構 ,每個
    發(fā)表于 01-16 07:29

    經典 C 語言編程,結構和聯(lián)合體如何共用?

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

    結構與指針的關系

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

    keil arm工程中結構1字節(jié)對齊如何實現(xiàn)

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