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

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

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

一個(gè)經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用實(shí)例

工程師進(jìn)階筆記 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 2023-05-04 11:49 ? 次閱讀

結(jié)構(gòu)體

結(jié)構(gòu)體占用的內(nèi)存大小,首先和編譯器的系統(tǒng)位數(shù)有關(guān)系,類似于CPU是 64 bits 還是 32 bits 的情形;其次,結(jié)構(gòu)體需要考慮字節(jié)對(duì)齊的問(wèn)題。實(shí)際上占用的內(nèi)存大小, 在 Linux 中可以 使用 sizeof 進(jìn)行獲取,默認(rèn)為字節(jié)對(duì)齊的大小。

聯(lián)合體

聯(lián)合體的參數(shù)共享同一個(gè)內(nèi)存地址,所占的內(nèi)存大小完全是由聯(lián)合體中參數(shù)類型決定字長(zhǎng),然后數(shù)據(jù)共享,內(nèi)存共享等。

結(jié)構(gòu)體和聯(lián)合體連用例子:1、首先定義一個(gè)結(jié)構(gòu)體,內(nèi)部包含聯(lián)合體,如下;

#defineMAX_SOFTKEY_LEN4

typedefenum
{
ENUM_TRANSFER,
ENUM_CONFERENCE,
ENUM_ANSWER,
ENUM_HOLD,
}KeyType;

typedefstructtag_CallRecordInfo
{
charline;//currentrecordingline.
unsignedcharstate;//currentmachinestate.
unsignedshorttotal;//currenttotalusedlines.
KeyTypetype;
union
{
charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer
charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer
charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer
charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer
}SoftKey;

}CallRecordInfo;

解釋如下結(jié)構(gòu)體:

聯(lián)合體union表示公用一個(gè)4字節(jié)的內(nèi)存,并且定義了一個(gè)聯(lián)合體變量SoftKey,這個(gè)
聯(lián)合體最大的好處就是在賦值或者清空時(shí)能夠直觀地清楚,不需要再引用聯(lián)
合體的參數(shù)。如:
CallRecordInfoinfo;
對(duì) info.SoftKey 的操作會(huì)影響聯(lián)合體內(nèi)部參數(shù)的值,并且數(shù)值一致。也
就是說(shuō),我們只要對(duì)info.SoftKey進(jìn)行賦值即可,然后聯(lián)合體內(nèi)的參
數(shù)內(nèi)容是一樣的。即:
info.SoftKey=info.SoftKey.TransferKey.

2、結(jié)構(gòu)體占用的內(nèi)存大小(作者的機(jī)器為 Ubuntu 18.04, sizeof(int) = 4 的機(jī)器)

9284f1a2-e79b-11ed-ab56-dac502259ad0.png

3、整體代碼

#include
#include
#include

#defineMAX_SOFTKEY_LEN4

typedefenum
{
ENUM_TRANSFER,
ENUM_CONFERENCE,
ENUM_ANSWER,
ENUM_HOLD,
}KeyType;

typedefstructtag_CallRecordInfo
{
charline;//currentrecordingline.
unsignedcharstate;//currentmachinestate.
unsignedshorttotal;//currenttotalusedlines.
KeyTypetype;


union
{
charTransferkey[MAX_SOFTKEY_LEN];//transferkeybuffer
charConferencekey[MAX_SOFTKEY_LEN];//conferencekeybuffer
charAnswerKey[MAX_SOFTKEY_LEN];//talkingkeybuffer
charHoldKey[MAX_SOFTKEY_LEN];//holdkeybuffer
}SoftKey;

}CallRecordInfo;

CallRecordInfoRecordInfo;

voidSetSoftKeyValue(intstate,KeyTypetype,char*keybuf)
{

RecordInfo.state=state;
RecordInfo.type=type;
memset(&RecordInfo.SoftKey,0,MAX_SOFTKEY_LEN);

if(NULL!=keybuf)
{
memcpy(&RecordInfo.SoftKey,keybuf,MAX_SOFTKEY_LEN);
}
}

intmain(intargc,charconst*argv[])
{

charbuf[4]="123";

SetSoftKeyValue(0,ENUM_TRANSFER,buf);

printf("
%s---%lu
",RecordInfo.SoftKey.Conferencekey,sizeof(CallRecordInfo));
return0;
}

4、結(jié)果

92920694-e79b-11ed-ab56-dac502259ad0.png

審核編輯:湯梓紅

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

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209371
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207912
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73538
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

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

    關(guān)注

    1

    文章

    127

    瀏覽量

    10800

原文標(biāo)題:一個(gè)經(jīng)典的結(jié)構(gòu)體和聯(lián)合體共用實(shí)例

文章出處:【微信號(hào):工程師進(jìn)階筆記,微信公眾號(hào):工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    430編程C語(yǔ)言常識(shí)(IAR)之結(jié)構(gòu)聯(lián)合體

    ,aa.d地址為N+1,是個(gè)奇數(shù)地址,因?yàn)?30在奇數(shù)地址只能讀取一個(gè)字節(jié),因此要訪問(wèn)d成員需要讀取兩次才能完成,后果是代碼變長(zhǎng)、速度變慢?! ∪? 匿名結(jié)構(gòu)
    發(fā)表于 11-22 15:43

    DLL導(dǎo)入結(jié)構(gòu) 聯(lián)合體

    DLL函數(shù)參數(shù)中,有結(jié)構(gòu)、聯(lián)合體結(jié)構(gòu)中使用聯(lián)合體,這種方式的函數(shù)怎么使用LABVIEW導(dǎo)入
    發(fā)表于 09-06 10:32

    聯(lián)合體問(wèn)題

    union U1{INT8Uax[4];FP32 fx;INT32Slx;INT32Uulx;INT16Six;INT16Uuix;INT8Scx;INT8Uucx;};U1 X_rom;//申請(qǐng)聯(lián)合接口數(shù)據(jù)變量定義如上的
    發(fā)表于 01-04 12:13

    如何定義了這個(gè)聯(lián)合體

    我先定義個(gè)聯(lián)合體數(shù)據(jù)類型,然后接著定義了聯(lián)合體變量,定義聯(lián)合體部分如下:我在sys_con
    發(fā)表于 07-12 04:28

    為什么位域結(jié)構(gòu)聯(lián)合體起使用?

    /*本例程是C語(yǔ)言的位域操作示例這里為什么位域結(jié)構(gòu)聯(lián)合體起使用?-->因?yàn)檫@樣定義后,即可以單獨(dú)使用標(biāo)志位 也可同時(shí)使用整個(gè)字節(jié)數(shù)據(jù)主要應(yīng)用:?jiǎn)纹瑱C(jī)C語(yǔ)言好處:用標(biāo)志位可以節(jié)省R
    發(fā)表于 07-14 06:23

    結(jié)構(gòu)共用的區(qū)別

    語(yǔ)言中,還有另外種和結(jié)構(gòu)非常類似的語(yǔ)法,叫做共用(Union),它的定義格式為:union 共用
    發(fā)表于 07-20 06:57

    結(jié)構(gòu)聯(lián)合體的區(qū)別到底在哪里

    在單片機(jī)軟件編程中,結(jié)構(gòu)和枚舉類型都很常用到,聯(lián)合體相對(duì)來(lái)用的就比較少。那么結(jié)構(gòu)聯(lián)合體的區(qū)
    發(fā)表于 11-22 07:54

    如何利用聯(lián)合體去判斷大小端呢

    轉(zhuǎn)載,如若侵權(quán),請(qǐng)聯(lián)系本人刪除。聯(lián)合體定義聯(lián)合體結(jié)構(gòu)樣都是自定義類型。聯(lián)合體也包含
    發(fā)表于 12-15 07:21

    聯(lián)合體/共用的使用方法

    大家好,我是ZhengN。本次給分享聯(lián)合體些知識(shí)。聯(lián)合體/共用的使用 C語(yǔ)言中,聯(lián)合體/
    發(fā)表于 02-28 10:05

    結(jié)構(gòu)struct和聯(lián)合體union的區(qū)別?

    結(jié)構(gòu)struct和聯(lián)合體union的區(qū)別?
    發(fā)表于 10-11 08:21

    C語(yǔ)言:結(jié)構(gòu)聯(lián)合體嵌套使用的實(shí)用操作

    。 定義個(gè)聯(lián)合類型的般形式為: 成員表中含有若干成員,成員的般形式為:類型說(shuō)明符 成員名。其占用的字節(jié)數(shù)與成員中最大數(shù)據(jù)類型占用的字節(jié)
    的頭像 發(fā)表于 12-24 16:07 ?5373次閱讀
    C語(yǔ)言:<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>、<b class='flag-5'>聯(lián)合體</b>嵌套使用的實(shí)用操作

    什么是C語(yǔ)言的聯(lián)合體

    名{ 成員列表 }; 共用有時(shí)也被稱為聯(lián)合或者聯(lián)合體,這也是 Union 這個(gè)單詞的本意。 結(jié)構(gòu)
    的頭像 發(fā)表于 07-29 15:35 ?3571次閱讀
    什么是C語(yǔ)言的<b class='flag-5'>聯(lián)合體</b>

    關(guān)于數(shù)字硬件建模SystemVerilog聯(lián)合體

    聯(lián)合體個(gè)可以有多個(gè)數(shù)據(jù)類型表示的單個(gè)存儲(chǔ)元素,聯(lián)合體的聲明類似結(jié)構(gòu),但推斷出的硬件非常不同
    的頭像 發(fā)表于 07-07 09:05 ?888次閱讀

    c語(yǔ)言中結(jié)構(gòu)聯(lián)合體的區(qū)別

    結(jié)構(gòu)、聯(lián)合體是C語(yǔ)言中的構(gòu)造類型,結(jié)構(gòu)我們平時(shí)應(yīng)該都用得很多。但是,對(duì)于聯(lián)合體
    的頭像 發(fā)表于 12-03 14:25 ?2376次閱讀
    c語(yǔ)言中<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>有<b class='flag-5'>聯(lián)合體</b>的區(qū)別

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

    中可以 使用 sizeof 進(jìn)行獲取,默認(rèn)為字節(jié)對(duì)齊的大小。 聯(lián)合體 聯(lián)合體的參數(shù)共享同一個(gè)內(nèi)存地址,所占的內(nèi)存大小完全是由聯(lián)合體中參數(shù)類型決定字長(zhǎng),然后數(shù)據(jù)共享,內(nèi)存共享等。
    的頭像 發(fā)表于 01-11 18:24 ?1081次閱讀
    <b class='flag-5'>經(jīng)典</b> C 語(yǔ)言編程,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和<b class='flag-5'>聯(lián)合體</b>如何<b class='flag-5'>共用</b>?