Ⅰ 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