當前位置:首頁 » 編程語言 » c語言聯合體存儲
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言聯合體存儲

發布時間: 2022-06-22 14:51:37

c語言聯合體內存計算

你的意圖我不是很明白,就說說我知道的地方吧,
聯合體就是你聲明的所有變數他們的起始地址是相同的。換句話說他們公用一塊地址。所以整個聯合體的大小取決於內部變數佔用空間最大的。
看看你聯合體內的成員
a佔4位元組
b[9]
佔9個位元組
c佔8個位元組,所以按照最大的計算,聯合體啊佔大小9個位元組,但是他還要滿足第二個條件,就是大小必須是內部成員基礎類型的整數倍。你的基礎類型是int
4位元組
char
1位元組
double
8位元組
取公因數並且要比9大所以他的大小事16個位元組。
第二個問題,你直接為一個該結構體的指針賦值(這種做法很危險,因為你不知道指向的空間具體是什麼內容),所以
pp
就指向了一個空間,然後
qq=pp+0x10
這里你要注意,並不是簡單地pp的地址值上加上0x10編譯器對這里的理解是
現在眼前有很多的該結構體類型,他們緊密排列,如果pp的編號是1
那麼qq的編號是1+0x10
所以說qq的實際指向地址

0x100000(pp的地址)+sizeof(dt)(每個結構體的大小)*0x10
注意結構體大小是16
是十進制
轉換成16進制也就是0x10
結果正好是0x100100了
所以最後的輸出就是輸出他們指向的地址值。

❷ C語言聯合體存儲方法

這個和體系結構有關。首先int行具體是1個位元組還是2個位元組是不確定的。早期的編譯器來說。int是一位元組。但是現在的都是2位元組。因為計算機處理器一般都是32位處理器。
聯合只取最大的空間。比如。你定義的聯合體。int
A,char
B[2],其實在計算機裡面只佔用了2個位元組。你存儲char時,全佔了。當你存儲為int類型時候。要麼佔用一半的空間。要麼全部都佔用了。這個和計算機體系結構有關。但是a和b是不會同時存在的。聯合中的成員同時只能有一個。這個是和結構體區別的地方。如果還有疑問建議你去看看書吧。這個是基礎知識。

❸ C語言中不同聯合體變數是否共用一個存儲單元

unionA{.......}內的成員,公用一個存儲單元.

unionAa;佔一個存儲單元

unionAb;佔一個存儲單元

共占兩個存儲單元.


至於union嵌套,依然遵循以上原則.聯合體內成員公用一個存儲單元.

unionAAA{
inta;
unionBBB{
double_a;
char_b;
}b;
}c;

BBB中包含_a 和 _b ,公用一個存儲單元, b占內存大小為double大小

AAA中包含a 和 b , 公用一個存儲單元 , c佔用內存大小為b的大小.

❹ C語言中關於聯合體的數據存放問題

聯合體內,成員變數共享內存。

現在聯合體內,有2個成員,一個是 y ( 需要4位元組存放),另一個是結構體x,
x 正好需要 4 位元組存放。所以這個聯合體大小隻 需要 4 位元組內存 就夠了。
(1個位元組描述1個8位2進制數, 1 byte = 8 bits, 位元組,是計算機內存 基本單位。)

主程序給 y 賦值 0x11223344 (16進制),正好放滿4位元組,4個位元組內容 是 11,22,33,44。

結構體x 共享這4個位元組里的內存。x.low 用了前2個位元組, x.high 用了後2個位元組,所以 x.low=0x1122,
x.high = 0x3344.

於是 num.x.low+num.x.high = 0x1122 + 0x3344 = 0x4466.

❺ 關於c語言中聯合體/共用體中數據存放的問題

你好!!!
首先我們了解聯合體的所有成員是在內存中共享一塊內存的,在某一時刻只能有一個成員使用這個內存!!!
我們來看看一個例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解釋如下:
union
{
int i;
char x[2];
}a;
在聯合體a中定義了兩種數據類型,字元數組x以及整形變數i.其中整形變數是16位的,數組大小為2的字元數組為8X2=16位。如此一來,編譯器便會為聯合體a在內存中開辟一個16位的空間,這個空間里存儲聯合體的數據,但是這個空間只有16位,它既是整形變數的數據,也是字元數組的數據。如果你的程序從字元數組的角度解析這個空間,那麼它就是兩個字元,如果你的程序從整型的角度解析這個空間,那麼它就是一個整數。
以你的程序為例子,現在已經開辟了一個16位的空間,然後我們假定現在空間還沒有被賦值,為:
00000000 00000000
那麼在運行完代碼
a.x[0] = 10;
a.x[1] = 1;
之後,16位的空間變為:
00001010 00000001
然後程序運行
printf("%d",a.i);
就是把聯合體a當成一個整數來解析,而不是字元串數組。那麼這樣一來,程序就把這16位變成了一個完整的整數:
(00000001 00001010)二進制 = (266)十進制
注意,你可以看到程序在把16位弄成整數的時候把後面八位放在了前面,前面八位放在了後面。這個反序是計算機存儲結構造成的,這個和聯合體沒有直接關系。如果感興趣的話可以參考匯編語言。

現在我們來看看,你給的例子:

union dt
{
int a;
char b;
double c;
}data;
此時的聯合體所佔的內存大小是8個位元組,接下來執行:
data.a=5;
此此時內存中就不是空的了,也就不會是你說的是隨機數,
但是輸出:printf("%lf",data.c);結果是0.000000,這個結果我還不能給你准確的解釋。但是我可以肯定這與系統把double轉換成int 和int 轉化成 double 有關!!!

暫時我只能解釋這那多!!!

❻ C語言中的聯合又什麼

樓主強,會員都出來了,難道其英文叫做vip?

呵呵

union myunion //聯合體名
{
//添加聯合體變數
};

❼ c語言:判斷聯合體中存儲的數據的類型

structexample
{
enum{
chaos,//沒有初始化,錯誤的狀態
int_t,//存的是int
chars_t,//存的是char
}type;
union{
inta;
charb[50];
};
}flag[10];

每次修改的時候手動設置type的值,沒有別的辦法

❽ 有關C語言聯合體

#include<stdio.h>
union un
{
int i;
char c[2];
};

void main( )
{
union un x;

x.i=0;
x.c[0]=10;
x.c[1]=1;
printf("%d\n",x.i);
}

運行結果:266

266的16進制是:0x010A
x.c[0]=10; 的16進制是0x0A
x.c[1]=1;的16進制是0x01

樓主,應該看出來它們的關系了吧?
__________________
|__x.c[0]__|__x.c[1]__|

如上圖,按char排放
當按int排放的時候,
x.c[1]是低位元組,x.c[0]是高位元組