今天一個讀者朋友給我發的一段代碼,這段代碼讓他有了疑惑。
代碼如下:
#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上看到的不一定我們想看到的,所以我們需要去變量的內存地址一探究竟,一定要了解內存的布局,對內存有所了解。
上面注釋的代碼,在我的電腦中運行的結果不相同,所以要看printf的準確輸出,應該初始化變量a。
使用gdb來查看地址,可以準確看到變量內存中的數據。
什么是大小端?
這個問題在之前的文章說過,這里再重新提一下
大端模式(Big-endian),是指數據的高字節,保存在內存的低地址中,而數據的低字節,保存在內存的高地址中
小端模式(Little-endian),是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中
我們用這個再來看看我們的程序
#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]在高地址,這個沒有什么意見吧?
內存就是一個尺子,它是不斷變長的,所以這個地址也是慢慢變大的,沒有任何問題吧。
然后,我們可以看看現在的輸出,從上面的輸出可以看到輸出100,也就是j[1]在高地址,j[0]在低地址,那這個計算機就是小端模式。
也可以通過查看內存地址來確認
責任編輯:haq
-
C語言
+關注
關注
180文章
7608瀏覽量
137119 -
代碼
+關注
關注
30文章
4802瀏覽量
68741
原文標題:C 語言,使用 union 了解內存
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論