c語言問題公用體,c語言共用體問題

2022-12-22 00:36:05 字數 4953 閱讀 6498

1樓:浮雲瞎了眼

在你上面那個例子中 聯合體的char型別 他實際在記憶體中的位元組數是4個位元組

整個聯合體的記憶體是12個位元組 因為聯合體他的記憶體儲存是跟相鄰基礎資料型別一致的

所佔內容小的要擴張 因為4個位元組的型別不可能縮小 所以記憶體直接為char分4個位元組的記憶體

2樓:寒寒家

union型別佔的記憶體由元素中佔記憶體最大的元素決定(和這個元素佔的位元組數相同)

不同元素公用的是同一塊記憶體。

比如這個例子中,char *和兩個int型別的變數,三者佔的記憶體都是sizeof(int) (指標佔的位元組數一般和int型別相同)

而且這三個變數用的是同一塊記憶體。

s.name = "wonglong"; 這是把這個常量字串的首地址賦值給了s.name,也就是修改了上面說到的共用的記憶體

s.age = 28;又是修改了上面的公用記憶體s.income = 1000又修改了公共的記憶體。

所以最後輸出公共記憶體的內容,以%d的方式就是1000了。

3樓:匿名使用者

首先,輸出的結果是:1000。//是正確的。

共用體,所有成員共享一段記憶體空間,在某個時刻,在該儲存單元中只能存放一個資料。

從後面的賦值語句,可以看得出來,最後,在這個共用體變數對應的儲存單元中存放的是1000。

所以,這個時候,你去輸出。或者引用 s.age或者s.income,其結果都是1000。

c語言共用體問題

4樓:匿名使用者

選擇c:公用體所佔的記憶體的長度是其成員型別的最大長度,此記憶體某一時刻只能存放一種資料,結構體內可以有公用體,公用體內也可以有結構體。

5樓:驕陽似火任響

其實這個方法,也不是沒人想到過,可是能不借助地球上的知識想到這個辦法的,都是

c語言共用體輸出問題

6樓:匿名使用者

#include

union

s;int main()

////

///聯合體又稱共用體,記憶體的最大空間是最大變數所佔的空間long 和int均佔四個位元組int a[2]佔8個位元組

//s.a[0]=0x39;///整個佔的空間應該是0x0039//s.a[1]=0x38;///整個佔的空間應該是0x0038//printf("%lx\n",s.

b);的時候是s.a[0]記憶體中的內容0x0039,因為是"%lx這種顯示方式所以為39

// printf("%c\n",s.c[0]);的時候是s.a[0]記憶體低地址一個位元組中的內容9 故顯示9

關於c語言共用體的問題謝謝

7樓:匿名使用者

dat已賦值,c沒有賦值,但它們存在於同一公用體裡,所以c的值是由dat的三個值決定。記憶體中儲存的是二進位制,所以應該將dat的三個值轉換為二進位制,然後每8bit為c的一個字元的值,所以可能出現負數

你可以將列印那句改成printf("%d\n",uni.c[i]); 以便觀察c的每一個值

8樓:

不明白你在說什麼,陣列c沒有被初始化就輸出,結果將是不可預知的!

c語言共用體問題

9樓:大維

計算機儲存的時候是把! 高位存在高地址 地位存在低地址! k佔用兩個位元組,k的高位對應的就是共用體陣列i的i[1],低位對應的就是i[0]

10樓:

圖上已經畫的很明白了啊,這個共用體是個兩位元組的物件,前一個位元組是0x02,後一個位元組是0x00,所以在printf的時候,先按照短整型取出資料0x0002(注意x86架構是小端模式,低位元組在前),再promote成為整型0x00000002,最後輸出的結果是2。

好好學習天天向上

11樓:自我程式設計

共用體,就是成員變數共用記憶體地址。

這裡記憶體低地址(r.i[0]),高地址(r.i[1]),分別儲存十進位制數2和0。在記憶體中以2進位制儲存,就分別是:

00000010和00000000。

當大端模式,高位資料在低地址,r.k讀取的數字就是00000010,00000000,也就是十進位制的512。

當小端模式,高位資料在高地址,r.k讀取的數字就是00000000,00000010,也就是十進位制的2。

所以你圖中結果,是因為你電腦是小端模式。

12樓:匿名使用者

低位先存 低位為2高位為0值為z

13樓:匿名使用者

x86短整兩位元組,高位元組在後。

則00000000 00000010(2)=2(10)如果交換r.i[0]=0,r.i[1]=2,則00000010 00000000(2)=512(10)

c語言中有關共用體的問題和意義

14樓:匿名使用者

公用體不適合你這種類似的需要有「記憶」的場景,如果要用,也是類似於資料塊前面有個資料頭,這樣整個資料塊和資料頭公用。另外,公用體通常有額外的資訊,指示當前資料型別是什麼。

15樓:匿名使用者

共用體在一次應用時只能n選1

16樓:

我真心沒懂...到底要幹什麼,一個變數被你翻來覆去的修改了...你還想要以前儲存的...你到底要幹嘛,這跟共用體有什麼關係啊...

c語言共用體的一個問題

17樓:匿名使用者

首先 共用體 分配最大元素的記憶體 ,所以分配了8個位元組i[0]=0x39 所以前 4個位元組 是 0x00 0x00 0x00 0x39

後4個位元組 就是 0x00 0x00 0x00 0x39然後 輸出這個 共用體的 (c char[4] 4個位元組)前4個位元組的 低位元組 也就是0x00 0x00 0x00 0x39這段記憶體的 低位元組 也就是0x39 就是57

以字元的形式 輸出 57 對應的ascii 就是 9

18樓:我is林倩倩

十六進位制ox39代表字元9 s0就是字元9

關於c語言共用體的問題

19樓:金色潛鳥

共同體(聯合體)的特點是所有成員變數共享同一塊記憶體單元。

另外(1)當各成員長度不相等 時,記憶體塊的大小由 最長的決定。-- 你的幾個成員長度相等,無此問題。

(2)資料存放時涉及位元組次序,分大端序和小端序。windows 用小端序。

小端序:

i[2] 的 排列 是 i[0] 2位元組,i[1] 下面的2位元組

i[0] 裡2個位元組 低位元組在前,高位元組在後 0x0039 排列成 0x39 0x00

i[1] 裡2個位元組 低位元組在前,高位元組在後 0x0038 排列成 0x38 0x00

於是4個位元組內容 是 0x39 0x00 0x38 0x00

翻譯成 long int k:

k 的4位元組 排列 是:最低位元組,低位元組,高位元組,最高位元組 (0x39 0x00 0x38 0x00)

輸出資料時要拼成:最高位元組 高位元組 低位元組 最低位元組 也就是 0x00 0x38 0x00 0x39

輸出為 0x00380039 (輸出格式 0x%08x)

或 380039 (輸出格式 %x)

大端序從略。

20樓:匿名使用者

共用體是構造資料型別,也叫聯合體

它使幾個不同型別的變數共佔一段記憶體(相互覆蓋),每次只有一個能使用.

結構體則不然, 每個成員都會有儲存空間的,可以一起用.

32位作業系統下 short int佔2位元組,int佔4位元組,38=1個位元組, 00=2個位元組,39=1個位元組;

為什麼先輸出38然後39呢,因為資料儲存在遵循了 先進後出原則,這涉及到共用體型別資料的儲存。這裡不能長篇大論了。

所以呢,s->k讀取的是 陣列i[2]地址的資料

21樓:匿名使用者

16進位制39,38化成二進位制就是111001和111000因為short int 2位元組就是16位,所以兩個都要在前面補0,每個都要夠16位

得到0000000000111001和0000000000111000

連起來就是00000000001110010000000000111000

然後你會發現這就是16進位制的380039

二級c語言,關於共用體的問題。。。。。

22樓:匿名使用者

union之所以成為共用體是因為所以成員公用一個記憶體空間,而union的大小是union中佔最大空間的那個成員的大小,

union un

的大小等於sizeof(int),4個位元組。

x.c[0]和x.c[1]同樣存在這個空間中,所以x.

i的四個位元組中的值就包括x.c[0]和x.c[1],但是x.

c[0]和x.c[1]究竟是佔高兩個位元組還是低兩個位元組,卻覺於系統是大端還是小端。如果是小端的話,x.

i=x.c[1]*256+x.c[0]=266,如果是大端的話,x.

i=x.c[0]*256^3+x.c[1]*256^2。

所以答案提示只是其中的一種情況。

至於什麼是大端小端,可以網上搜一下,多的是。如果在windows上驗證的話,就是小端,也就是答案提示的那樣。

23樓:

一個int佔用2個位元組。一個char佔用1個位元組。所以一個int等於兩個char。

然後就是int使用的是小端模式。比如記憶體裡面的資料是0x12,,0x34,那麼這個數就是0x3412。

地址高的是高位,所以x.c[1]必須得乘以0xff,就是0x3400,然後加上0x12,就是0x3412了。

c語言關於結構體的小問題,C語言關於結構體的小問題

在f函式中s是一個臨時的變數,它隨著f的呼叫而產生,隨著f的結束而消失,你這裡的交換只是在f中臨時調換了p指向的地址,並沒有改變p指向地址的記憶體中的內容,要想改變裡面的內容就要解指標,給具體存放資料的記憶體賦值,例如p 1 s 1 等等.這很簡單啊,陣列下標從0開始,s 1 是第二個 輸出結果當然...

在c語言裡面,共用體和結構體的區別

結構體與共來用體 1.結構源體 struct 定義 結構體是由一系列具有相同資料型別或不同資料型別的資料構成的資料集合。例子 struct student 2.共用體 union 定義 union維護足夠的空間來放置多個資料成員中的 一種 而不是為每一個資料成員配置 空 間,在union中所有的資料...

c語言memset初始化結構體問題

1.memset函式的原型void memset void s,char ch,size t n 函式的第一個形式引數是指標型別,所以實參因為一個地址,即 a注意 a與a是不同的.a是結構體變數名,而 a是變數a的地址.2.另外memset 是一個庫函式函式,需要加標頭檔案 include 3.正如...