C语言,使用union了解内存
今天一個讀者朋友給我發(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\n",a.i);return?0; }他的幾個測試代碼以及輸出
這里說一個問題,我們從printf上看到的不一定我們想看到的,所以我們需要去變量的內(nèi)存地址一探究竟,一定要了解內(nèi)存的布局,對內(nèi)存有所了解。
上面注釋的代碼,在我的電腦中運行的結(jié)果不相同,所以要看printf的準確輸出,應(yīng)該初始化變量a。
使用gdb來查看地址,可以準確看到變量內(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\n",a.i);return?0; }j[0]在低地址,j[1]在高地址,這個沒有什么意見吧?
內(nèi)存就是一個尺子????,它是不斷變長的,所以這個地址也是慢慢變大的,沒有任何問題吧。
然后,我們可以看看現(xiàn)在的輸出,從上面的輸出可以看到輸出100,也就是j[1]在高地址,j[0]在低地址,那這個計算機就是小端模式。
也可以通過查看內(nèi)存地址來確認
相關(guān)文章
計算機驗證大小端
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關(guān)注公眾號,后臺回復(fù)「1024」獲取學(xué)習(xí)資料網(wǎng)盤鏈接。
歡迎點贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~
嵌入式Linux
微信掃描二維碼,關(guān)注我的公眾號
總結(jié)
以上是生活随笔為你收集整理的C语言,使用union了解内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HiJson(Json格式化工具)64位
- 下一篇: iOS 手势冲突