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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C/C++ 中結(jié)構(gòu)體輸出異常的原因(存儲結(jié)構(gòu))

C/C++ 中結(jié)構(gòu)體輸出異常的原因(存儲結(jié)構(gòu))

慕田峪4524236 2019-04-09 20:23:32
typedefstruct{doubled_num;charc;intnum;}Node;intmain(){Noden={1.0000,'a',3};printf("%d%c%d\n",n.d_num,n.c,n.num);}其中應(yīng)解釋為64位double的部分被解釋為32位整型。運(yùn)行以上會顯示970,怎么用存儲結(jié)構(gòu)來解釋這種異常?
查看完整描述

2 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個贊

你用的是32位系統(tǒng)。我們gcc-S看下它的匯編:
1fld1
2fstpl32(%esp)
3movb$97,40(%esp)
4movl$3,44(%esp)
5movl44(%esp),%edx
6movzbl40(%esp),%eax
7movsbl%al,%eax
8fldl32(%esp)
9movl%edx,16(%esp)
10movl%eax,12(%esp)
11fstpl4(%esp)
12movl$.LC1,(%esp)
13callprintf
14movl$0,%eax
11行,存入浮點(diǎn)數(shù)到地址4(%esp),這是printf的第一個參數(shù)。通過gdb可以看到其十六進(jìn)制表示為0x000000000x3ff00000。把它的前一個字作為一個整數(shù),即「0」;
10行,%eax的值是把40(%esp)的低字節(jié)(第6、7行)弄過來的,即'a',也就是打印出來的「97」;
而printf中%c對應(yīng)的那個'\0'是怎么來的呢?它是那個浮點(diǎn)數(shù)的后一個字的最低字節(jié)。
64位系統(tǒng)上函數(shù)調(diào)用方式不一樣。結(jié)果是97,\3,97。其中第三個「97」是編譯器以為那個寄存器printf函數(shù)不會用所以殘留的之前的值,因?yàn)樗牡诙€參數(shù)是浮點(diǎn)數(shù),通過%xmm0寄存器傳遞的,但是printf認(rèn)為沒有浮點(diǎn)數(shù)所以不使用。不同參數(shù)所使用的寄存器沒什么規(guī)律,如下:
Thefirst6integerparametersinafunctionunderLinuxarepassed
inregistersrdi,rsi,rdx,rex,r8andr9
                            
查看完整回答
反對 回復(fù) 2019-04-09
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個贊

printf("%d%c%d\n",n.d_num,n.c,n.num);
首先觀察應(yīng)該更加細(xì)致一點(diǎn),應(yīng)該還有更多的東西你需要測試。
printf("%d\n%c\n%d\n",n.d_num,n.c,n.num);
下面進(jìn)入正題:
首先我們看一下正常的情況,%lf%c%d,printf()函數(shù)是怎么運(yùn)行的呢?它從右到做把%lf%c%d壓到棧里面去,然后就去結(jié)構(gòu)體中取數(shù)據(jù)了[2]?,F(xiàn)在棧頂是%lf,那么取64位出來,就得到了d.d_num,然后取8位的d.c,最后取32位的d.num。(我這里沒有考慮內(nèi)存對齊的問題和各種細(xì)節(jié))
然后我們來看%d%c%d,他取數(shù)據(jù)大小的順序則是32832,ok,那么堆棧里的數(shù)據(jù)是
1.0000,'a',3
show_double(n.d_num);
show_char(n.c);
show_int(n.num);
//n.d_num:0x000000000000f03f
//n.c:0x61
//n.num:0x03000000
我們看一下,32位全為0,后面連續(xù)的8位也為0,manascii'\0'=>0,
剩下的顯示的n.num就是32位的0x61了,也就是a,至于最后的n.num,壓根沒動。
嘗試把1.000改大一點(diǎn),結(jié)果自然會變化。
參考:
csappshow_bytescode
stackoverflow:HowdoestheparticularCfunctionwork?
                            
查看完整回答
反對 回復(fù) 2019-04-09
  • 2 回答
  • 0 關(guān)注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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