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

c語言中結構體求大小

發布時間: 2022-02-28 14:19:59

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語言的結構體大小

看起來好像沒啥問題,不過有一點還是要懷疑一下, 就是輸出的a,a的格式符你用的%d ,這個不對, a是個結構體,可能不可以這樣輸出,你可以把a和對應的%d刪掉試試看

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

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

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

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

Ⅳ c語言問題,struct的大小

首先int的大小就和編譯器有關.vc的話就是4

另外計算結構體大小的是以結構體中
**所佔位元組最大的變數的倍數**(或者說來對齊的)

簡單點說,結構體大小就是其中變數所佔大小的最小公倍數(這個數還必須大於所有變數所佔大小的和)

你提問中c-1 i-4 f-4 d-8(我用vc)
公倍數是8,16,24,32...所有變數所佔大小和是1+4+4+8=17
所以就是24了.

Ⅳ 關於C語言結構體類型的大小

這樣才是你的結果
#pragma pack(1)
struct stu
{

}

#pragma pack()

Ⅵ C語言,結構體數組的長度

C語言不支持動態分配內存,你需要自己分配,大概這樣
#include<stdio.h>
#include<stdlib.h>
typdef struct Node
{
int value;
int next;
}Node;

int main()
{
int a;
scanf("%d",&a);
Node *p=malloc(a*sizeof(Node));
.......
}
這樣p就相當於Node數組的第一個元素的指針,也可以當作數組名使用了。

Ⅶ C語言--結構體大小

這與編譯器的編譯選項有關,如果按C語言的本意則結果應為401,但很多編譯器都對結構類型的成員變數進行了按4位元組或8位元組對齊,這樣做可以提高數據存儲速度,對齊後結構的大小就只能是4或8的整數倍。

Ⅷ C語言如何求結構體數組長度

sizeof可以求出單個結構體大小,還得乘以數組個數。

Ⅸ C語言結構體大小問題

量內存的起始地址的邊界是跟它類型一致的
比如int類型,可以認為它存在4的倍數的地址,short存在2位元組倍數開始的地址,char存在1位元組開始的地址,即任意地址
因此,回過頭來看
第一個結構
假設int a;///4位元組倍數地
short b;//推理a的末尾是4位元組倍數地址也是2位元組倍數地址,所以b是挨著a存的
char c;//任意其實地址,挨著b存放
看起來7個位元組就放下了,但是需要兼顧4位元組對齊的原則,在末尾補了一個位元組

第二個結構也類似

結構體與普通類型並無大區別,存儲區域也一樣的

Ⅹ C語言中一個結構體變數大小是選擇題

明顯 是 D
B是陷阱
具體原因是 編譯器為了操作方便,會把大小不是 4 的倍數的結構體,
轉化為 4 的倍數, 列如 53 轉化為 56
你可以 自己試驗
struct
{ int a
char b
}; 大小為 8