當前位置:首頁 » 編程語言 » 結構體的大小計算公式c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

結構體的大小計算公式c語言

發布時間: 2022-06-27 23:12:39

c語言結構體所佔用的位元組數如何計算

結構體的數據類型的有點多我們就不啰嗦了,直接來看相同數據結構體的幾種書寫的格式吧。

格式一:

01.structtagPhone
02.{
03.charA;
04.intB;
05.shortC;
06.}Phone;

格式二:

01.structtagPhone
02.{
03.charA;
04.shortC;
05.intB;
06.}Phone2;

格式三:

01.structtagPhone3
02.{
03.charA;
04.charB[2];
05.charC[4];
06.}Phone3;


我們都知道,char類型佔用1個位元組,int型佔用4個位元組,short類型佔用2個位元組,long佔用8個,double佔用16個;

那麼我們可能會犯一個錯誤就是直接1+4+2=7,該結構體佔用7個位元組。這是錯的。

以下我們簡單分析下:

計算結構體大小時需要考慮其內存布局,結構體在內存中存放是按單元存放的,每個單元多大取決於結構體中最大基本類型的大小。

對格式一:

上面結構計算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個欄位大小之和,這也是最節省空間的一種寫法。

總結:

第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的數據類型。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;


第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組類型,丟失了欄位本生的數據類型,不方便使用;


第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的數據類型。


只要了解是這些寫法的差異性,可以視情況選用。

㈡ C語言計算結構體長度問題

struct tt;
{
int n1;char n2;float n3;//因為4位元組對齊,這里是12個位元組
union uu//這里是個union,所以裡面的內容最大的,作為它的大小,所以是用int u1[2],佔8個位元組
{
int u1[2];char u2[2];
}su;
};
最後的結果,應該是12+8= 20
11是絕對不正確的。
值得注意的是,編譯器有些可以設置對齊方式的,會影響結構體的大小

㈢ C語言中結構體數組長度怎麼計算

結構體數組的長度計算方法和普通數組相同。
1、c語言中,定義數組後可以用sizeof命令獲得數組的長度(即可容納元素個數)。但是通過傳遞數組名參數到子函數中,以獲得數組長度是不可行的,因為在子函數當中,數組名會退化為一個指針。
2、例如:
int
data[4],length;
length=sizeof(data)/sizeof(data[0]);
//數組占內存總空間除以單個元素占內存空間大小,即等於元素個數
printf("length
of
data[4]=%d",
length
);
//輸出length
of
data[4]=4

㈣ C語言求結構體sizeof怎麼求

sizeof()用來測給定的數據類型在內存中占的位元組長度;
比如我想知道int類型變數占幾個位元組 就這樣使用:len = sizeof(int) 就可以了,len就是int型變數在內存中位元組數;
當然你也可以這么用 int a; len = sizeof(a); 編譯器會知道a是int型變數的,會自動換成sizeof(int);
另外 自己定義的數據類型也可以用sizeof來求位元組數,比如定義了一個類class A{...},然後你
這樣用:len = sizeof(A),就能知道A佔了幾個位元組;
最後,提示下,sizeof是關鍵字或者說是運算符,不是函數,它的結果是編譯的時候就確定了的,沒有函數調用;

㈤ 結構體類型的長度計算

計算方法:
運算符sizeof可以計算出給定類型的大小,對於32位系統來說,sizeof(char)
=
1;
sizeof(int)
=
4。基本數據類型的大小很好計算,我們來看一下如何計算構造數據類型的大小。
c語言中的構造數據類型有三種:數組、結構體和共用體。
數組是相同類型的元素的集合,只要會計算單個元素的大小,整個數組所佔空間等於基礎元素大小乘上元素的個數。
結構體中的成員可以是不同的數據類型,成員按照定義時的順序依次存儲在連續的內存空間。和數組不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在存儲結構體變數時的地址對齊問題。看下面這樣的一個結構體:
struct
stu1
{
int
i;
char
c;
int
j;
};
先介紹一個相關的概念——偏移量。偏移量指的是結構體變數中成員的地址和結構體變數地址的差。結構體大小等於最後一個成員的偏移量加上最後一個成員的大小。顯然,結構體變數中第一個成員的地址就是結構體變數的首地址。因此,第一個成員i的偏移量為0。第二個成員c的偏移量是第一個成員的偏移量加上第一個成員的大小(0+4),其值為4;第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。
實際上,由於存儲變數時地址對齊的要求,編譯器在編譯程序時會遵循兩條原則:一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)
二、結構體大小必須是所有成員大小的整數倍。
對照第一條,上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。
對照第二條,結構體大小等於最後一個成員的偏移量加上其大小,上面的例子中計算出來的大小為12,滿足要求。
再看一個滿足第一條,不滿足第二條的情況
struct
stu2
{
int
k;
short
t;
};
成員k的偏移量為0;成員t的偏移量為4,都不需要調整。但計算出來的大小為6,顯然不是成員k大小的整數倍。因此,編譯器會在成員t後面補上2個位元組,使得結構體的大小變成8從而滿足第二個要求。由此可見,大家在定義結構體類型時需要考慮到位元組對齊的情況,不同的順序會影響到結構體的大小。對比下面兩種定義順序
struct
stu3
{
char
c1;
int
i;
char
c2;
}
struct
stu4
{
char
c1;
char
c2;
int
i;
}
雖然結構體stu3和stu4中成員都一樣,但sizeof(struct
stu3)的值為12而sizeof(struct
stu4)的值為8。
如果結構體中的成員又是另外一種結構體類型時應該怎麼計算呢?只需把其展開即可。但有一點需要注意,展開後的結構體的第一個成員的偏移量應當是被展開的結構體中最大的成員的整數倍。看下面的例子:
struct
stu5
{
short
i;
struct
{
char
c;
int
j;
}
ss;
int
k;
}
結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。
如何給結構體變數分配空間由編譯器決定,以上情況針對的是linux下的gcc。其他平台的c編譯器可能會有不同的處理。

㈥ C語言,結構體問題所佔內在位元組數,怎麼算的

在c語言中如何計算結構體長度和共用體長度?
結構體的長度等於體內各個成員變數長度之後。如此題長度為字元串數組的長度加上兩個int型變數的長度,再加上double長度,最後結果為10+2+2+8=22。解析:char 每個字元佔一個位元組(因為是一個十長度的字元數組)所以是10位元組,int占兩個位元組,double佔8個位元組。所以最後是10+2*2+8=22。
共用體的長度是體內成員中最長的長度。如果一個共用體內最長長度為12位元組,則共用體的長度就是12。
希望能夠幫到你。如果還有什麼問題在問?

㈦ C語言結構體變數的大小問題

還要考慮編譯器優化的內存對齊

C語言標准本身沒有要求結構體/聯合體的成員間內存存儲需要連續

編譯器為了高效存取數據,犧牲部分內存空間,提高存取的效率

㈧ C語言中的結構體的大小如何計算

用sizeof這個操作符來確定
你的程序的話如下
int
size=sizeof(student);
由於C語言會對自定義類型進行存儲優化,可以實際大小比把結構體里的所有原子類型加起來要大,

㈨ C++中結構體的大小

結構體(struct)的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到存儲空間的位元組對齊問題。先看下面定義的兩個結構體.
struct
{
char
a;
short
b;
char
c;
}S1;
struct
{
char
a;
char
b;
short
c;
}S2;
分別用程序測試得出sizeof(S1)=6
,
sizeof(S2)=4
可見,雖然兩個結構體所含的元素相同,但因為其中存放的元素類型順序不一樣,所佔位元組也出現差異。這就是位元組對齊原因。通過位元組對齊,有助於加快計算機的取數速度,否則就得多花指令周期。
位元組對齊原則
結構體默認的位元組對齊一般滿足三個准則:
1)
結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;
2)
結構體每個成員相對於結構體首地址的偏移量(offset,即每個成員的起始地址)都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal
adding);
3)
結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing
padding)。
注意:當結構體成員裡面有數組成員時,如int
a[10],要看成10個整形變數才參與計算。
通過這三個原則,就不難理解上面兩個struct的差異了.
對於struct
S1,
為了使short變數滿足位元組對其准則(2),
即其存儲位置相對於結構體首地址的offset是自身大小(short佔2個位元組)的整數倍,必須在位元組a後面填充一個位元組以對齊;再由准則(3),為了
滿足結構體總大小為short大小的整數倍,必須再在c後面填充一個位元組。
對於struct
S2,
卻不必如上所述的填充位元組,因為其直接順序存儲已經滿足了對齊准則。
如果將上面兩個結構體中的short都改為int(佔4個位元組),
那麼會怎麼樣呢?
程序得出sizeof(S1)=12,
sizeof(S2)=8
利用上面的准則,也不難計算得出這樣的結果。S1中在a後面填充3個位元組、在c後面填充3個位元組,這樣一共12個位元組;S2中在a、b順序存儲之後填充兩個位元組用以對其,這樣一共就8個位元組。
當然,在某些時候也可以設置位元組對齊方式。這就需要使用
#pragma
pack

#pragma
pack(push)
//壓棧保存
#pragma
pack(1)//
設置1位元組對齊
struct
{
char
a;
short
b;
char
c;
}S1;
#pragma
pack(pop)
//
恢復先前設置
如上所示,將對其方式設為1位元組對齊,那麼S1就不填充位元組,sizeof為各元素所佔位元組之和即4。這一點在從外部2進制文件中讀入struct大小的數據到struct中,是很有用的.
另外,還有如下的一種方式:
·
__attribute((aligned
(n))),讓所作用的結構成員對齊在n位元組自然邊界上。如果結構中有成員的長度大於n,則按照最大成員的長度來對齊。
·
__attribute__
((packed)),取消結構在編譯過程中的優化對齊,按照實際佔用位元組數進行對齊。

㈩ C語言結構體及長度問題

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

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