今天一個(gè)讀者朋友給我發(fā)的一段代碼,這段代碼讓他有了疑惑。
代碼如下:
#include “stdio.h”int main()
{
typedef union{
short i;
char j[2];
}DATA;
DATA a;
a.j[0] = 10;
a.j[1] = 1;
printf(“%x
”,a.i);
return 0;
}
這里說(shuō)一個(gè)問(wèn)題,我們從printf上看到的不一定我們想看到的,所以我們需要去變量的內(nèi)存地址一探究竟,一定要了解內(nèi)存的布局,對(duì)內(nèi)存有所了解。
上面注釋的代碼,在我的電腦中運(yùn)行的結(jié)果不相同,所以要看printf的準(zhǔn)確輸出,應(yīng)該初始化變量a。
使用gdb來(lái)查看地址,可以準(zhǔn)確看到變量?jī)?nèi)存中的數(shù)據(jù)。
什么是大小端?
這個(gè)問(wèn)題在之前的文章說(shuō)過(guò),這里再重新提一下
大端模式(Big-endian),是指數(shù)據(jù)的高字節(jié),保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié),保存在內(nèi)存的高地址中
小端模式(Little-endian),是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中
我們用這個(gè)再來(lái)看看我們的程序
#include “stdio.h”int main()
{
typedef union{
short i;
char j[2];
}DATA;
DATA a;
//a.j[0] = 10;
a.j[1] = 1;
printf(“%x
”,a.i);
return 0;
}
j[0]在低地址,j[1]在高地址,這個(gè)沒(méi)有什么意見(jiàn)吧?
內(nèi)存就是一個(gè)尺子,它是不斷變長(zhǎng)的,所以這個(gè)地址也是慢慢變大的,沒(méi)有任何問(wèn)題吧。
然后,我們可以看看現(xiàn)在的輸出,從上面的輸出可以看到輸出100,也就是j[1]在高地址,j[0]在低地址,那這個(gè)計(jì)算機(jī)就是小端模式。
也可以通過(guò)查看內(nèi)存地址來(lái)確認(rèn)
責(zé)任編輯:haq
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7595瀏覽量
135867 -
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68236
原文標(biāo)題:C 語(yǔ)言,使用 union 了解內(nèi)存
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論