今天一個讀者朋友給我發(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;
}
這里說一個問題,我們從printf上看到的不一定我們想看到的,所以我們需要去變量的內(nèi)存地址一探究竟,一定要了解內(nèi)存的布局,對內(nèi)存有所了解。
上面注釋的代碼,在我的電腦中運行的結(jié)果不相同,所以要看printf的準(zhǔn)確輸出,應(yīng)該初始化變量a。
使用gdb來查看地址,可以準(zhǔn)確看到變量內(nèi)存中的數(shù)據(jù)。
什么是大小端?
這個問題在之前的文章說過,這里再重新提一下
大端模式(Big-endian),是指數(shù)據(jù)的高字節(jié),保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié),保存在內(nèi)存的高地址中
小端模式(Little-endian),是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nè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]在高地址,這個沒有什么意見吧?
內(nèi)存就是一個尺子,它是不斷變長的,所以這個地址也是慢慢變大的,沒有任何問題吧。
然后,我們可以看看現(xiàn)在的輸出,從上面的輸出可以看到輸出100,也就是j[1]在高地址,j[0]在低地址,那這個計算機就是小端模式。
也可以通過查看內(nèi)存地址來確認(rèn)
責(zé)任編輯:haq
-
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137719 -
代碼
+關(guān)注
關(guān)注
30文章
4827瀏覽量
69054
原文標(biāo)題:C 語言,使用 union 了解內(nèi)存
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
虛擬內(nèi)存不足如何解決 虛擬內(nèi)存和物理內(nèi)存的區(qū)別
虛擬內(nèi)存的作用和原理 如何調(diào)整虛擬內(nèi)存設(shè)置
DDR5內(nèi)存與DDR4內(nèi)存性能差異
DDR內(nèi)存故障排查方法
DDR內(nèi)存超頻技巧與注意事項
Linux內(nèi)存泄露案例分析和內(nèi)存管理分享
![Linux<b class='flag-5'>內(nèi)存</b>泄露案例分析和<b class='flag-5'>內(nèi)存</b>管理分享](https://file1.elecfans.com//web2/M00/0B/0B/wKgaomcaAfmARLxeAABRvgTXMno355.png)
內(nèi)存模組n/a怎么解決?
邏輯內(nèi)存和物理內(nèi)存的區(qū)別
如何使用反射內(nèi)存交換機
影響內(nèi)存延遲的因素有哪些
內(nèi)存時鐘是什么意思
內(nèi)存的種類都有哪些?有什么區(qū)別?
聯(lián)想小新Pro 2024 AI銳龍版支持7500MHz內(nèi)存與核顯性能提升
C語言內(nèi)存泄漏問題原理
![C語言<b class='flag-5'>內(nèi)存</b>泄漏問題原理](https://file1.elecfans.com/web2/M00/C4/F2/wKgZomX5CPGAHxynAAAdVE956KA826.png)
評論