① c語言共用體初始化錯誤
不知道說的對不對 簡單猜測一下
初始化陵源敗的時候7000被首先賦予brand成員 但是brand為字元型 所以7000被截斷 只取到了最末8位 然後輸出時只出現了最後8位的ASCII形式 即X 至裂答於price則是因為格式不符合float形尺顫式直接輸出為0了 大膽的猜測一下 如果交換一下兩個成員的位置可能price成員能正常輸出而brand成員會失敗吧...所以這個題目還是用結構體正常一點
② 關於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語言中的共用體是什麼
所謂共用體類型是指將不同的數據項組織成一個整體,它們在內存中佔用同一段存儲單元。其定義形式為:
union 共用體名
{成員表列};
union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了一個共用體數據類型union data ,定義了共用體數據類型變數obj。共用體數據類型與結構體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結構體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結構體類型所佔的內存空間為其各成員所佔存儲空間之和。而形同結構體的共用體類型實際佔用存儲空間為其最長的成員所佔的存儲空間。
對共用體的成員的引用與結構體成員的引用相同。但由於共用體各成員共用同一段內存空間,使用時,根據需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設計人員在同一內存區對不同數據類型的交替使用,增加靈活性,節省內存。
可以引用共用體變數的成員,其用法與結構體完全相同。若定義共用體類型為:
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。
main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最後一行的輸出是我們無法預料的。其原因是連續做mm.d='W';mm.b=34.2;兩個連續的賦值語句最終使共用體變數的成員mm.b所佔四位元組被寫入34.2,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了共用體變數的正確用法。
④ 請教!C語言裡面的共用體變數定義為什麼不能初始化呢
共用體若有多個變數,因為占的是同一內存空間,如閉逗緩果多個變數都初始化的話,後面變數會覆蓋前面的變數。所以嚴格的說,共用體定義時只能對一轎模個成員指核初始化。
⑤ C語言共同體問題
首先這個是共用體,所以各個變數公用輪乎一段內存,你s->i[0]=0x39;s->i[1]=0x38;賦值以後,對應的該段內存最後佔8個位元組(兩個int,根據編譯器來戚斗確定)的區域被賦值,char型佔一個位元組,你輸出c[0],也就是第一個位元組的數據被輸出。而整形數據占的4個位元組,在存儲時是低位在前的,比如0x11121314.在存儲時會被先讀取0x14放在第一個位元組0x13第二個位元組,依次下去,所以0x39相當於在前四個位元組的地址高桐磨中存為0x39,0x00,0x00,0x00.這樣你讀取第一個位元組的時候就是0x39了。
⑥ C語言之共用體類型
三、共用體類型
共用體中的所有成員共用同一段內存芹模核(所有成員的起始地址都是一樣的)格式:
註:
(1)成員列表為定義該共用體的成員,成員定義與普通變數
的方式一樣。
(2)成員列表必須用一對花括弧括起。
(3)共用體名可以省略
如:
定義了一個名data的共用體類型,該類型有三個嫌掘成員:i ch s
1、共用體變數的定義
(1)先定義類碼培型,再定義變數
(2)定義類型的同時,定義變數
(3)直接定義變數
注
由於共用體類型變數的所有成員都共用一段內存,所以共用體類型變數所佔的位元組數等於該共用體類型中佔用位元組數最多的成員所佔的位元組數。
2、共用體變數的引用
註:
(1)不能整體引用共用體變數,只能引用其成員。
引用的格式:共用體變數名.成員名
(2)同類型成員共享值
(3)在內存中整型數據的二進制數低8位佔用前面一個位元組,高8位佔用後面一個位元組。
如:
整數255,在內存中的存儲形式為:
11111111 00000000一個字元型數據佔用一個位元組,對於數組來說前面元素佔用前面的位元組。
(4)共用體變數之間可以相互賦值,賦值後兩個變數應使用同一成員。
(5)共用體變數的地址與各成員的地址都相同的。
(6)在定義共用體時,可以對其進行初始化,但只能有一個初值且必須用花括弧將初值括起。相當於給第一個成員賦值。
(7)共用體、結構體的成員均可以是共用體或結構體類型。
(8)不能用共用體類型變數做為函數參數。
(9)計算共用體佔用位元組數。
練習題1:
練習題2:
練習題3:
⑦ 怎樣初始化共用體類型變數C語言
#include <stdio.h>游沒
struct aa
{
int x;
int y;
};
union un
{ int a;
char b;
float c;
} arr ={5};
void main()
{
struct aa xx={1,2};
printf("和銀%d %d %d",xx.x,xx.y,arr.a);
}
打神棚納印出:
1 2 5
⑧ c語言聯合體的初始化問題
。。。
局部變數不作初始化是隨機值,全局變數會被定義為0;
⑨ 在c語言中,共用體一般有什麼作用
共用體一般指聯合體,作用如下:
1、節省內存
有兩個很長的數據結構,不會同時使用,用結構體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了。
2、做某些轉換用
union{char a[8];double x;};
x=20.8;
cout<<hex<<a[0]<<「 」<<a[1]<<…<<endl;
(9)共用體初始化c語言擴展閱讀:
結構體和共用體
結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。
結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。
共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義類型,可以通過它來創建變數,