怎樣輸出結構體變數所佔內在長度,C語言,結構體問題?所佔內在位元組數,怎麼算的???

時間 2022-08-20 03:35:05

1樓:

這個涉及到對齊的問題了,為了提高訪問效率所有存放在記憶體的資料都以一定方式對齊,所謂對齊就是存放地址必須能被資料大小整除。比如說存放整型數的地址必須能被4整除,在結構體裡以對齊要求最嚴的那個數為準,字元型的要求地址被1整除,短型的要求地址能被2整除,整型的要求地址能被4整除,顯然要求最嚴的是整型,於是結構的大小要能被4整除以便能對齊,於是你那個結構體大小就變成8了,中間還填充了一位。

2樓:匿名使用者

原因:地址對齊。

因為cpu定址的原因,把每個成員的地址按照定址規則對齊。

目前編譯器基本都按照4位元組對齊。

詳細:目前pc電腦基本都是32位處理器,就是cpu一次定址能夠從記憶體中讀出四個位元組的資料,cpu定址時,只尋找地址為4的倍數的地址。

例如0x00000000,0x00000004,0x00000008按照4位元組對齊的方法,

struct a

;如果a1的記憶體地址為0,則b1的地址為4,c1的地址為5,d1的地址為8

這樣編譯器能使程式最高速度的執行。

如果都按1位元組對齊,例如:a1-0,b1-4,c1-5,d1-6d1成員佔記憶體範圍為6~9,在讀取成員d1的時候,cpu要進行兩次定址。第一次定址為4,第二次定址為8。

如果按4位元組對齊,d1的地址為8,cpu一次定址就可以讀取d1的值。

大致就是這個道理,多看看書就明白了。

3樓:匿名使用者

這是由於系統對齊操作造成的,現在一般常見的四位元組對齊。

所以不同順序會造成佔用空間不同。

也就是說,如果幾個成員佔用的空間總和不是4的倍數,會被補成4,然後再分配下一個成員的空間。

4樓:匿名使用者

字對齊,書上說的是這種情況:(vc)

#pragma pack(1)

struct xx

;#pragma pack();

一般編譯器都預設對其4位元組

5樓:匿名使用者

因為位元組對齊的問題。

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

6樓:智狐博文

在c語言中如何計算結構體長度和共用體長度?

結構體的長度等於體內各個成員變數長度之後。如此題長度為字串陣列的長度加上兩個int型變數的長度,再加上double長度,最後結果為10+2+2+8=22。解析:

char 每個字元佔一個位元組(因為是一個十長度的字元陣列)所以是10位元組,int佔兩個位元組,double佔8個位元組。所以最後是10+2*2+8=22。

共用體的長度是體內成員中最長的長度。如果一個共用體內最長長度為12位元組,則共用體的長度就是12。

希望能夠幫到你。如果還有什麼問題在問?

7樓:匿名使用者

有位元組對齊現象。如一個成員佔1個位元組,後面就要添一個額外的位元組湊足2位元組,有些系統要添額外的3位元組湊足4位元組。總之最後結構體佔總位元組數是2的整數倍或4的整數倍。

例如佔19個位元組是不可能的,必須佔20個位元組

8樓:匿名使用者

你的結構體當中,佔位元組數最大的變數是double型別,是8個位元組,所以這個結構體的大小是以8位元組來對齊的,也就是它的大小是8的整數倍。再來看成員變數的大小:ch[10]佔了10個位元組,再加上變數i的大小就是14位元組,但是再加上指標變數p的大小(4個位元組)的時候,成了18,它不是8的倍數(也就是沒有位元組對齊),所以ch[10]和變數i一共佔16個位元組,然後指標p佔8個位元組(p本身只佔4個位元組,但是加上後面的k的話一共是12個位元組,沒有位元組對齊,所以單獨為它分配了8個位元組的空間),k也佔了8個位元組,所以它的大小應該是16+8+8=32

9樓:匿名使用者

有個對齊問題,如果是4位元組對齊的,32位系統那麼 ch[10] 佔用前十個位元組(0 - 9),為了對齊,int i佔用四位元組(12 - 15)int *p 佔用4位元組(16 - 19)double k佔用8位元組 (24- 31)因此,總共是32個位元組

10樓:145飛雪

結構體所佔記憶體大小為結構體各成員變數所佔記憶體大小之和

本例共32位元組

結構體變數佔記憶體的大小由什麼決定?

11樓:

舉個例子說明

struct data

;struct stu

;這裡影響佔記憶體的大小的因素首先是有兩個成員(name),其次是每個成員的內容,包括long型的num和birthday,並且birthday又是一個嵌入的結構體。

12樓:匿名使用者

通常,由結構體內每個成員的資料型別的大小的和決定。

13樓:黃河小魚

由裡面變數的大小的及位對齊情況決定

14樓:獨霸天下週倩

還要考慮是否對齊等因素

請教結構體變數所佔用的位元組數

15樓:匿名使用者

是因為結構體有對齊要求。

可以看一下這篇文章。

16樓:匿名使用者

記憶體對齊

共用體變數所佔記憶體長度等於?

17樓:開心紅茶杯

16位下是2個位元組,32位下是4個位元組

char:1個位元組

float:4個位元組

共用體共用一段空間,且與最大的那個變數佔用空間相等,所以是4個位元組。

18樓:

你定義的型別,佔用位元組最大那個。例如

int a;

float b;

就按float,佔用4個位元組。

19樓:帳號已登出

等於裡面所佔記憶體最大的那個變數的 長度 設為最佳答案吧

20樓:匿名使用者

為最長的那個結構體的長度,結構體的長度還要注意下位元組對齊的問題。

一個結構體變數佔記憶體的位元組數有時不等於各成員變數佔位元組數之和,為什麼,具體說明下

21樓:匿名使用者

因為定義的時候不一定是定義成位元組對齊的,所以相加起來位元組數不對,你可以搜一下什麼叫位元組對齊。

結構體型別的長度計算

22樓:等待的幸福快樂

計算方法:

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof(char) = 1; sizeof(int) = 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。

c語言中的構造資料型別有三種:陣列、結構體和共用體。

陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列所佔空間等於基礎元素大小乘上元素的個數。

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的地址對齊問題。看下面這樣的一個結構體:

struct stu1

;先介紹一個相關的概念——偏移量。偏移量指的是結構體變數中成員的地址和結構體變數地址的差。結構體大小等於最後一個成員的偏移量加上最後一個成員的大小。

顯然,結構體變數中第一個成員的地址就是結構體變數的首地址。因此,第一個成員i的偏移量為0。第二個成員c的偏移量是第一個成員的偏移量加上第一個成員的大小(0+4),其值為4;第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小(4+1),其值為5。

實際上,由於儲存變數時地址對齊的要求,編譯器在編譯程式時會遵循兩條原則:一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍) 二、結構體大小必須是所有成員大小的整數倍。

對照第一條,上面的例子中前兩個成員的偏移量都滿足要求,但第三個成員的偏移量為5,並不是自身(int)大小的整數倍。編譯器在處理時會在第二個成員後面補上3個空位元組,使得第三個成員的偏移量變成8。

對照第二條,結構體大小等於最後一個成員的偏移量加上其大小,上面的例子中計算出來的大小為12,滿足要求。

再看一個滿足第一條,不滿足第二條的情況

struct stu2

;成員k的偏移量為0;成員t的偏移量為4,都不需要調整。但計算出來的大小為6,顯然不是成員k大小的整數倍。因此,編譯器會在成員t後面補上2個位元組,使得結構體的大小變成8從而滿足第二個要求。

由此可見,大家在定義結構體型別時需要考慮到位元組對齊的情況,不同的順序會影響到結構體的大小。對比下面兩種定義順序

struct stu3

struct stu4

雖然結構體stu3和stu4中成員都一樣,但sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。

如果結構體中的成員又是另外一種結構體型別時應該怎麼計算呢?只需把其即可。但有一點需要注意,後的結構體的第一個成員的偏移量應當是被的結構體中最大的成員的整數倍。看下面的例子:

struct stu5

ss;int k;

}結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。

如何給結構體變數分配空間由編譯器決定,以上情況針對的是linux下的gcc。其他平臺的c編譯器可能會有不同的處理。

23樓:匿名使用者

不能像樓主這樣解釋,計算結構體的長度,不能忽略一個引數:

#pragma pack(8); //這個8是結構體預設的對齊引數,其作用是:

1>當結構體中有變數型別佔的長度比這個大,那麼該結構的對齊引數就是8;

2>如果結構體中成員的型別都比這個預設值小,那麼該結構體的對齊引數就是該結構體中佔用空間最長的成員變數的長度,如instruct a;的對齊長度是1(字元變數佔1個位元組)

根據樓主的輸出,樓主的執行環境pack(4),因為a中double佔的字元大於4,所以結構體a的對齊引數為4,那麼結果就是4+4+4,實際後面兩個4是存一個double資料;第二題int a;已經等於4,所以對齊變數為4。

當知道對齊規則後,那麼記憶體是怎麼排列的呢?

定義變數的時候先找到一個記憶體地址,根據計算機的內部結構(我還不是很清楚),會選用一個可用的,而且對對齊變數求餘為0的地址作為儲存該結構體的地址。

如2題既然對齊變數為4,那麼一定會選一個4的整數倍的地址作為儲存這個結構體的起始地址,

然後是10個char型別,佔10個位元組,此時,下面的地址已經不能整除4了,比如8+10=18已經不能整除4,所以會空2個位元組,從20開始儲存int,正好4個位元組,地址變為24,能被4整除,也就是char s[10]和int a,佔用了12(有2個空位元組)+4=16個位元組,由於int a後的地址能被4整除,所以a k,的長度就是a的長度為12,所以b的長度為28。

你可以#pragma pack(8);來修改預設的對齊引數來測試。

24樓:匿名使用者

這個問題確實有點糾結,但不是沒有規律。

首先求位元組長度用sizeof(...)

#include

int main()

;struct b;

int a=sizeof(a);

int b=sizeof(b);

printf("%d%d",a,b);

}輸出16,32而不是12,26.

預設對齊,應該是以struct的最大元素為對齊基數,也就是(double)8的倍數(第二個b為16的倍數。

正如三樓」所說在定義結果體的時候最好把相同型別的成員放到一起,可以節省空間「

具體lz可以去試試。

c語言結構體別名定義問題,C語言結構體別名定義問題

typedef struct stu linklist 此處第一了一個型的型別,即struct stu 即指向結構體stu的指標 所以head的型別也就是struct stu head為一個指向stu結構體型別的指標。但是並沒有未其分配具體的空間。可以將一個已定義為stu結構體的指標賦給它。 c語言...

C語言中連結串列中的結構體指標變數問題求教

定義結構體指標變數時,只分配儲存指標型別需要的空間,比如listnode p 這裡p有給他分配儲存指標的4個位元組的空間。實際上你是要讓p指向一個結構體空間的,這個結構體空間在哪?可以先定義listnode a 然後 p a 這時p指向一個之前申請分配過空間 編譯器設定過其地址和大小,在棧空間存放著...

c語言memset初始化結構體問題

1.memset函式的原型void memset void s,char ch,size t n 函式的第一個形式引數是指標型別,所以實參因為一個地址,即 a注意 a與a是不同的.a是結構體變數名,而 a是變數a的地址.2.另外memset 是一個庫函式函式,需要加標頭檔案 include 3.正如...