A. 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 求大小與預期一樣的寫法,但是全部使用位元組類型,丟失了欄位本生的數據類型,不方便使用;
第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的數據類型。
只要了解是這些寫法的差異性,可以視情況選用。
B. 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. 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是關鍵字或者說是運算符,不是函數,它的結果是編譯的時候就確定了的,沒有函數調用;
D. C語言,結構體問題所佔內在位元組數,怎麼算的
在c語言中如何計算結構體長度和共用體長度?
結構體的長度等於體內各個成員變數長度之後。如此題長度為字元串數組的長度加上兩個int型變數的長度,再加上double長度,最後結果為10+2+2+8=22。解析:char 每個字元佔一個位元組(因為是一個十長度的字元數組)所以是10位元組,int占兩個位元組,double佔8個位元組。所以最後是10+2*2+8=22。
共用體的長度是體內成員中最長的長度。如果一個共用體內最長長度為12位元組,則共用體的長度就是12。
希望能夠幫到你。如果還有什麼問題在問?
E. c語言結構體的問題,存儲空間大小
win32
4位元組對齊
變數內存的起始地址的邊界是跟它類型一致的
比如int類型,可以認為它存在4的倍數的地址,short存在2位元組倍數開始的地址,char存在1位元組開始的地址,即任意地址
因此,回過頭來看
第一個結構
假設int
a;///4位元組倍數地
short
b;//推理a的末尾是4位元組倍數地址也是2位元組倍數地址,所以b是挨著a存的
char
c;//任意其實地址,挨著b存放
看起來7個位元組就放下了,但是需要兼顧4位元組對齊的原則,在末尾補了一個位元組
第二個結構也類似
結構體與普通類型並無大區別,存儲區域也一樣的
F. C語言結構體及長度問題
C語言 標准類型中 有 long int 和 short int, 但沒有規定 int 長度
一般編譯器把 int 處理成 long int ( 4 Bytes), 少數編譯器 把 int 處理成 short int ( 2 Bytes),
struct stu
{ short int Number; // 處理成 short , 2 位元組
char Name[10];
} a;
sizeof(a) 等於 12
------------------------
struct stu
{ long int Number; // 處理成 long, 4位元組
char Name[10]; // 考慮 4 位元組對齊,+2
} a;
sizeof(a) 等於 16
======================
sizeof(b)的值 (32位系統) 一般編譯器處理成 unsigned long int 得 4
老式編譯器, (16位系統) 處理成 unsigned short int 得 2
===
你的題目源於老編譯器,老的16位系統,或老舊的教材。
G. c語言 結構體 共用體 占內存位元組
共用體:
sizeof(union
data1)的值為16.在編譯器默認設置的情況下,該共用體最大基本類型為double,它佔8位元組,所以此共用體以8來對齊。字元數組c2佔9個位元組,那麼整個共用體應該佔9個位元組,但按照對齊原則,實際分配給它的內存為16位元組。
結構體:
struct
data以8個位元組對齊,long類型的成員1分配8個位元組。s、i、c、a原本分別佔4、2、1、10個位元組。由於考慮到對齊,s分配4個位元組,i分配
2個位元組,c分配2個位元組,此時剛好用完8個位元組。a原本分配10個位元組,由於考慮到對齊,要使整個結構體所佔的存儲空間是8的倍數,所以分配給它16個位元組。因此結構體data佔8+4+4+2+16=32個位元組。
H. C語言中,在說明一個結構體變數時系統分配給它的存儲空間怎麼計算
struct dog
{
char ch[10];
int i;
int *p;
double k;
}dog1;
在c語言中如何計算結構體長度和共用體長度?
結構體的長度等於體內各個成員變數長度之後。如此題長度為字元串數組的長度加上兩個int型變數的長度,再加上double長度,最後結果為10+2+2+8=22。解析:char 每個字元佔一個位元組(因為是一個十長度的字元數組)所以是10位元組,int占兩個位元組,double佔8個位元組。所以最後是10+2*2+8=22。
共用體的長度是體內成員中最長的長度。如果一個共用體內最長長度為12位元組,則共用體的長度就是12。
希望能夠幫到你。如果還有什麼問題在問?
I. C語言中的結構體的大小如何計算
庫函數sizeof();參數是結構體的變數。如果你自己計算的話就是每個結構體成員的大小相加,不同編譯器下是不同的,所以用sizeof()比較好。int
有的編譯器是2位元組,有的就是4位元組。你舉得例子就是int
2位元組+float
4位元組+char
1位元組。
J. 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是絕對不正確的。
值得注意的是,編譯器有些可以設置對齊方式的,會影響結構體的大小