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

c語言共用體長度

發布時間: 2022-04-03 08:09:38

『壹』 c語言的結構體類型的長度

strlen是求字元串長度的,string length的縮寫嘛
你想求大小的話,可以用sizeof(card);

結構體的大小可是一個非常讓人頭痛的問題啊。。。我反正還是經常對自己的判斷不太肯定
我從別的地方給你找了一個說明,你可以參考一下

在預設對齊下我先給你說下三條准則吧,
【1】結構體變數的首地址能夠被其最寬基本類型成員的大小所整除
【2】結構體每個成員相對於結構體首地址的偏移量是成員大小的整數背
【3】結構體的總大小為結構體最寬基本類型成員大小的整數背
以上都是結構體中只有基本類型時的預設對齊方式,當有嵌套復合成員時,
【2】改為:復合成員相對於結構體首地址偏移量是復合成員最寬基本類型大小的整數背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;
先是第一成員400個位元組,然後還有個char一個位元組,為了滿足第第三條准則,即總大小401為最寬基本類型的整數背,明顯401不是最寬基本類型int(4)的整數背,所以總大小為404
希望樓主能理解,呵呵

『貳』 C語言中,該共用體的大小為何是12

所謂共用體類型是指將不同的數據項組織成一個整體,它們在內存中佔用同一段存儲單元。其定義形式為:
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語言共用體問題~~

其實union表示裡面的三個變數公用一塊內存,這里最大的是int(和float一樣大),即4個位元組,也就是說三個變數公用4個位元組,所以最後一次賦值a.i=0x2341;會使得最終著4個位元組的值為0x00002341,而char c取得是最有一個位元組,即十六進制的41,對應字元就是'A', 而int當然取得就是十六進制的0x2341,轉換為10進制就是9025了,對於float,它對應的二進制如下:0 00000000 00000000010001101000001,詳細的自己查標准吧。

『肆』 C語言中共用體變數所佔內存長度等於

C語言中共用體變數所佔內存長度等於其中長度最長的那個成員的長度

『伍』 C語言共用體問題

結果是A。
你定義了一個union類型的變數,名字是ts,大小為4個位元組;ts可以用來存放int類型和長度為2個位元組的char型數組,其實這個union ts類型在的時候只是在這兩個類型中選用一個,只是共用了同一塊內存地址,並且與它們聯系的都是這塊內存的首地址罷了。
你下面是給c[0]和c[1]分別賦值A和B,此時與變數i相聯系的數據應該是AB,而你在調用printf函數時,是以%c的格式輸出變數i裡面存的數據,所以只能輸出A。

『陸』 C語言細節:共用體的位元組長度問題

union 里的成員 共享 內存。
哪個成員 長度最長,內存大小就 用它決定。
另外,編譯器考慮「內存對齊」,32位機上考慮 按32 位對齊,也就是 4 位元組 對齊。
需要的最大長度不為4 的整數 倍數 時,給它分配 多1個或2個或3個位元組,湊成4 的整數 倍數。

int a; 需內存大小 sizeof(int)
char b[x]; 需內存大小 x * sizeof(char).
M1 = sizeof(int);
M2 = x * sizeof(char).
if (M2 > M1) M = M2; else M = M1;
if (M%4 != 0) M = (M / 4 + 1) * 4;
例如:
x=6; M1=sizeof(int)=4; M2= 6 * sizeof(char) = 6;
M=M2=6;
M%4 = 6%4 = 2; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (6/4+1) * 4 = 8.
結果 8。
例如:
x=7; M1=sizeof(int)=4; M2= 7 * sizeof(char) = 7;
M=M2=7;
M%4 = 7%4 = 3; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (7/4+1) * 4 = 8.
結果 8。
===========
sizeof(test)=4n // 必須 4 位元組 對齊, 所以必定是4的整倍數
4(n-1)<=x<=4n // x 的個數,當然 小於等於 總位元組數4n, 大於等於 4n-4 個位元組數。

『柒』 c語言關於結構體長度的問題

. 結構體的sizeof這是初學者問得最多的一個問題,所以這里有必要多費點筆墨。讓我們先看一個結構體:struct S1{char c;int i;};問sizeof(s1)等於多少聰明的你開始思考了,char佔1個位元組,int佔4個位元組,那麼加起來就應該是5。是這樣嗎你在你機器上試過了嗎也許你是對的,但很可能你是錯的!VC6中按默認設置得到的結果為8。Why為什麼受傷的總是我請不要沮喪,我們來好好琢磨一下sizeof的定義——sizeof的結果等於對象或者類型所佔的內存位元組數,好吧,那就讓我們來看看S1的內存分配情況:S1 s1 = { 'a', 0xFFFFFFFF };定義上面的變數後,加上斷點,運行程序,觀察s1所在的內存,你發現了什麼以我的VC6.0為例,s1的地址為0x0012FF78,其數據內容如下:0012FF78: 61 CC CC CC FF FF FF FF發現了什麼怎麼中間夾雜了3個位元組的CC看看MSDN上的說明:When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.原來如此,這就是傳說中的位元組對齊啊!一個重要的話題出現了。為什麼需要位元組對齊計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令周期了。為此,編譯器默認會對結構體進行處理(實際上其它地方的數據變數也是如此),讓寬度為2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度為4的基本數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。讓我們交換一下S1中char與int的位置:struct S2{int i;char c;};看看sizeof(S2)的結果為多少,怎麼還是8再看看內存,原來成員c後面仍然有3個填充位元組,這又是為什麼啊別著急,下面總結規律。位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個准則:1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)。對於上面的准則,有幾點需要說明:1) 前面不是說結構體成員的地址是其大小的整數倍,怎麼又說到偏移量了呢因為有了第1點存在,所以我們就可以只考慮成員的偏移量,這樣思考起來簡單。想想為什麼。結構體某個成員相對於結構體首地址的偏移量可以通過宏offsetof()來獲得,這個宏也在stddef.h中定義,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要獲得S2中c的偏移量,方法為size_t pos = offsetof(S2, c);// pos等於4

『捌』 c語言共用體高低位元組問題

平時我們用的操作系統
稱為小端操作系統
特點是低位保存在低地址中
於是
對於int型,佔4個位元組,
用來存0x1234的時候,實際存的是0x00001234
而在內存中的順序是
0x34
0x12
0x00
0x00
所以,這里輸出會是
34,12

『玖』 C語言中共同體的大小是其成員的大小的和對嗎

不是,共用體只分配一個內存空間,然後各成員數據存在這一個空間中,相互覆蓋。

『拾』 C語言結構體及長度問題

a四位元組對齊,所以應該是16
b是指針,就是4個位元組

你那個答案是16位機器,現在上哪找去。。