第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

146. 設(shè)有以下定義語(yǔ)句:

146. 設(shè)有以下定義語(yǔ)句:

C
包小龍蝦 2018-08-01 11:55:12
146. 設(shè)有以下定義語(yǔ)句:struct student{ int num;char name[10];float score;} wang,zhang;則變量wang所占的內(nèi)存字節(jié)數(shù)是( )。A. 14B. 16C. 18D. 20求會(huì)的大神解析下,拜托了
查看完整描述

3 回答

已采納
?
onemoo

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊

每種類型都有一個(gè)叫做“對(duì)齊值”的屬性。這個(gè)屬性相當(dāng)于描述“在內(nèi)存中其能夠分配的起始地址和前一一個(gè)此類型能夠分配的起始地址的間距”。

啊,好吧,我的文字表達(dá)能力比較差,上述說(shuō)法我自己看著都覺(jué)得累,其實(shí)通俗地說(shuō)就是限制了“能在內(nèi)存中哪些位置放這個(gè)類型的對(duì)象”。

我還是舉些例子吧,我們?cè)诩傧氲囊恍《蝺?nèi)存中進(jìn)行描述,這段內(nèi)存的起始地址被當(dāng)作 0 地址:

  • 假定 int 類型本身占 4 字節(jié),對(duì)齊值也是 4。那么如果想在這段內(nèi)存中放一個(gè) int 變量,能放在哪里呢?

    起始的 0 字節(jié)處當(dāng)然可以放。但如果我不從這段內(nèi)存起始處放,能不能從第 2 字節(jié)處放一個(gè) int 呢?? 答案是不可以!

    因?yàn)?int 的對(duì)齊值是 4。內(nèi)存 0 字節(jié)之后,只能間隔 4 字節(jié)再放一個(gè) int 對(duì)象,所以只能在這段內(nèi)存的 4 字節(jié)處放一個(gè) int。注意:這并不是因?yàn)?0 到 3 字節(jié)被前一個(gè) int 占用了!即便這段內(nèi)存中只放一個(gè) int,前面 0 到 3 字節(jié)都是空的,也不能在 1、2、3 字節(jié)處放置 int ——兩個(gè)合法的放置 int 的起始地址必須間隔 4。

    也就是只能在這段內(nèi)存的 0、4、8、12 ....字節(jié)處分配 int 對(duì)象。

  • char 類型本身占用 1 字節(jié)(這點(diǎn)不用假設(shè)了,C標(biāo)準(zhǔn)規(guī)定如此),對(duì)齊值也是 1 。那么你可以知道,這段內(nèi)存的任何一個(gè)字節(jié)處都可以合法地放置一個(gè) char 對(duì)象。

  • 我希望你看懂了我的這些羅嗦解釋。

還有,就像你知道 C 語(yǔ)言是很靈活的,其實(shí) C 標(biāo)準(zhǔn)并沒(méi)有規(guī)定每種類型具體占用內(nèi)存的大小和其對(duì)齊值,不同平臺(tái)可能有自己的規(guī)定。C 標(biāo)準(zhǔn)只是規(guī)定了對(duì)齊值必須是 2 的整數(shù)次冪(從 C11 標(biāo)準(zhǔn)開(kāi)始,你可以用 _Alignof 運(yùn)算符來(lái)獲得類型的對(duì)齊值)


union 的所有成員的起始地址都一樣,所以基本上不用考慮對(duì)齊的問(wèn)題。

struct 的不同成員是依次放置于內(nèi)存中的,每個(gè)成員在內(nèi)存中的位置都必須滿足其類型對(duì)齊值的要求!? 而整個(gè) struct 的對(duì)齊值一般是其成員對(duì)齊值中最大的一個(gè)(不過(guò)此題不涉及這點(diǎn))。


正如我前面提到 C 標(biāo)準(zhǔn)沒(méi)有具體規(guī)定類型的對(duì)齊值。那么嚴(yán)格地說(shuō),這道題出得也不嚴(yán)謹(jǐn),它應(yīng)該說(shuō)明這些類型的對(duì)齊值再讓學(xué)生做計(jì)算的。既然它沒(méi)說(shuō),我就用常見(jiàn)的對(duì)齊值來(lái)解釋下題目中的 struct:

  • int 占 4 字節(jié),對(duì)齊值為 4。所以 struct 中前 4 個(gè)字節(jié)就是這個(gè) num,這是很顯然的。

  • char 占 1 字節(jié),對(duì)齊值為 1。數(shù)組中元素是緊挨著放置的,所以 name 數(shù)組占 10 字節(jié)。

    這樣 struct 前 14 個(gè)字節(jié)就是 num 和 name 占用的。

  • float 占 4 字節(jié),對(duì)齊值為 4。那第三個(gè)成員 score 就不能從第 15 字節(jié)起了。它必須放在 4 的倍數(shù)的位置上,所以第 15、16 字節(jié)要被空出來(lái),從第 17 字節(jié)處放置 score。score 占用第 17、18、19、20 字節(jié)。

那么整個(gè) struct 就占用 20 字節(jié)。??

查看完整回答
1 反對(duì) 回復(fù) 2018-08-12
  • 包小龍蝦
    包小龍蝦
    嗯嗯,看了大神的回答,我自己理了一下思路,以后這樣子想對(duì)嗎?:union 沒(méi)有涉及到字節(jié)對(duì)齊的問(wèn)題,所以在碰到union 時(shí)還是按“union 占用的內(nèi)存就是其最大成員占用的大小”只有在碰到結(jié)構(gòu)體時(shí)才考慮對(duì)齊的問(wèn)題。就是說(shuō):“結(jié)構(gòu)體大小等于最后一個(gè)成員的偏移量加上其大小”,int 類型本身占 4 字節(jié),對(duì)齊值也是 4,char 類型本身占用 1 字節(jié),而char name[10];占10,與前面的4相加就是14,而因?yàn)橐獫M足(1)結(jié)構(gòu)體變量中成員的偏移量必須是成員大小的整數(shù)倍。又因?yàn)閒loat 類型要占4,所以前面的14要再加上2變成16,也就是float score;的偏移量是16,16滿足(1)結(jié)構(gòu)體變量中成員的偏移量必須是成員大小的整數(shù)倍。加上他本身的大小4,就變成了20。再滿足一個(gè)條件就是‘(2)結(jié)構(gòu)體大小必須是所有成員大小的整數(shù)倍,即所有成員大小的公倍數(shù)。’而20就是 int num; char name[10]; float score; 這三個(gè)的公倍數(shù)。
  • onemoo
    onemoo
    再準(zhǔn)確點(diǎn)的話,不是“成員的偏移量必須是成員大小的整數(shù)倍”,而應(yīng)該說(shuō)是“成員的偏移量必須是成員的類型的對(duì)齊值的整數(shù)倍”。
  • onemoo
    onemoo
    也不是“結(jié)構(gòu)體大小必須是所有成員大小的整數(shù)倍”,而應(yīng)該是“結(jié)構(gòu)體大小必須是其對(duì)齊值的整數(shù)倍”。 結(jié)構(gòu)體的對(duì)齊值一般是它所有成員對(duì)齊值中最大的一個(gè)。 這個(gè)例子中的結(jié)構(gòu)體,其成員對(duì)齊值最大的是4,所以結(jié)構(gòu)體的對(duì)齊值也為4。那么20恰好滿足4的倍數(shù),所以結(jié)構(gòu)體的大小就是20了。
點(diǎn)擊展開(kāi)后面5
  • 3 回答
  • 2 關(guān)注
  • 1929 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)