C語言中 結構體內部定義的不同型別的變數分配地址是不是連續的

時間 2022-08-31 22:40:16

1樓:

您好!這個問題要涉及到一個叫「對齊基數」的問題(具體到檢視),先說解決方法:

如果你的結構體中最小成員變數為char型,可在程式開始增加#pragma pack(1)這樣的語句,其他的類推,如最小成員變數為short型,那就把1變成2(不知道你用的什麼環境,由於我目前用的vc、vs,其他環境未做嘗試,所以不太明瞭)

具體規則如下:

(1)、結構體變數的首地址要能被其最寬的基本型別成員的大小和編譯器對齊基數中較小的(暫把這個數稱作「當前對齊基數」)所整除(32位系統,vc6.0預設對齊基數是8)。

(2)、結構體每個成員相對於結構體首地址的偏移量都是當前對齊基數的整數倍,如有需要編譯器會在成員之間加上填充位元組

(3)、結構體的總大小為當前對齊基數的整數倍,如有需要編譯器會再最末一個成員之後加上填充位元組

這麼幾條規則,看起來不好懂,其實很簡單,你的這個問題主要用到第

二、三條,舉個例子(vc6.0下):

struct test

這個結構體中,char為1位元組,float為4位元組,但是sizeof(struct test)卻是12位元組,這裡面就是「對齊基數」的作用。根據上面的結論,對於這個結構體,它的當前對齊基數是4,雖然char c1只有一位元組,但是編譯器會給他後面新增3位元組的填充位元組,讓float的地址對齊到4位元組,所以c1和f的實際地址是不連續的,c2同理,所以這個結構體的大小是12位元組。

如果確實需要,可以更改vc預設對齊基數,就用上面的語句:#pragma pack(n),其中n改成需要的值就可以了,一般為1,2,4,8....

希望會對你有幫助!

2樓:匿名使用者

地址分配時連續的。但說到結構體關鍵在於記憶體對齊,這個具體你可以看看百科。

3樓:o丨

是連續的,跟定義陣列一樣,同一個集合的在一起。

c語言問題:為什麼同一型別的變數分配記憶體時,他們的地址是連續的?

4樓:風若遠去何人留

如果同一個變數 不管是結構體 還是普通變數記憶體必然是連續的

如果不是同一個變數 而是幾個變數 記憶體不一定連續比如int a;

char b;

int c;

一般來說 a和c的地址不可能連續。

請問c語言中陣列成員在記憶體中的地址是連續存放的,結構體的成員在記憶體中是連續存放的嗎?

5樓:倒黴熊

一般來說,結構體成員在記憶體中是連續存放的。

6樓:

這個不一定,結構體所佔用的記憶體是連續的,但其中各個成員不一定是連續存放的,要看你結構體中定義成員順序是否有位元組對齊,可參見:http://www.

7樓:

結構體的成員在記憶體中不一定是連續存放的,因為要符合對齊要求,就有可能空出某些單元來。比如:

c中結構體型別與共用體型別變數的不同點是什麼

8樓:匿名使用者

結構體, 是一組資料的合集. 每個結構體成員擁有自己的獨立記憶體.

共用體, 是一個資料, 可以被轉為不同型別. 所有共用體成員共同佔有相同區域.

所以,在不考慮對齊時, 結構體大小是所有成員佔空間之和.

共用體大小是佔空間最大的成員大小.

9樓:匿名使用者

最大的區別是他們對記憶體的佔用。結構體中的每個元素,都會按照資料型別的大小在記憶體中分配儲存空間,結構體所佔用的記憶體空間是其中所有元素所佔用的記憶體空間的和,是一個固定的數值。共用體變數所佔用的記憶體空間的大小是由所有元素中佔用空間最大的元素決定的,他們共用這個空間。

其次,結構體中的元素可以同時存在,而在共用體變數中,在某一時刻,只能有共用體中的一個變數存在。

c語言問題,以下對結構體型別變數的定義中,不正確的是( )要解析哦,謝謝。

10樓:怒刷全唐詩

選b宣告struct 後面必須跟結構體的名字

cd 都是宣告結構體 aa

a 由於是typedef, 結構體名aa緊跟後面給出

11樓:成都

- -|| 雖然有的格式寫的不規範,但是理論都是正確的。

12樓:s如詩如夢

如果說編譯的話,4個都是正確的

c語言,老師問了一個問題:為什麼在定義結構體變數之前,必須先定義結構體型別?

13樓:自我程式設計

定義變數,就是在記憶體中申請空間,資料型別就與系統的約定,按照什麼樣的資料型別的儲存格式和計算邏輯對待。所以定義變數都需要指明型別,比如int a 就是指明int型。

那麼同理,結構是多種型別集合體,那麼定義結構變數,就必須先定義結構體型別。

14樓:影者東昇

這問題問的太弱智了吧,就像你做米飯之前,肯定要有米一樣。

不定義結構體型別,**來結構體型別來定義結構體變數。

就是說定義結構體變數,一定要先有該結構體型別。

如下面的例子:

// 這是結構體型別student的定義

struct student

;// 下面是結構體stu變數,是具體的某個物件了。

student stu;

// 如果你沒有定義student這個結構體型別,程式就不知道stu是什麼型別的變數了。

15樓:

型別是類,變數是類的一個物件,c中的普通變數型別是在標頭檔案中定義好了的,所以你可以拿來就定義變數,如int型,而使用者想要建立一個新型別的必須定義一個此型別的模板這就是類,有了類才可以建立這個累的一個例項就是變數或者說此類的一個物件

c++中2道結構方面選擇題,詳細解釋一下 當定義一個結構體變數時,系統為它分配的記憶體空間是

16樓:

分配的記憶體空間為 12

32位且4位元組對齊時佔用的位元組數為12位元組。

16位2位元組對齊時佔用的位元組數為6位元組。 源**如下:

#includestruct s; void main()執行結果如下

17樓:滄海雄風

#include

struct s

;void main()

12press any key to continue嚴謹的說這題都不對

32位且4位元組對齊時時12

16位2位元組對齊時時6

至於結構體變數所佔大小

這個問題不是簡單的int 4 + char 1 + float 4 = 9 這麼算的(除非是設定了1位元組對齊)

是按最大元素的倍數湊整的

18樓:匿名使用者

可以把結構體理解為一個特殊的陣列,可以把任意型別的資料放在一起。每種型別的資料都是真實存在於記憶體中的。所以,為了儲存這些資料,必須為每種型別都分配記憶體空間。

而一個結構體的記憶體空間就為它包含的所有成員的記憶體之和。。

19樓:匿名使用者

結構體是線性順序儲存的一組資料,佔用結構體內所有元素所需儲存空間的總和。

c語言結構體變數的地址是啥呢?

20樓:睿爾科技嵌入式

是相同的。

str是一個結構體的變數。型別為struct ss。而a[4]是這個結構體的每一個成員,str的地址值與int a[4]的地址值一樣,但僅僅是地址值是一樣的,而地址是有型別的,兩者型別不一樣,str的地址型別為sturct ss *,而成員a[4]的地址型別為int *。

21樓:五白曼

結構體的首地址就是你結構體第一個元素的首地址,在這裡看來,str的首地址就是a的地址。

C語言中定義結構體如何在不同的 C檔案中使用

家谷秋魯曠 struct node 這樣就定義了一個結構體型別node,它有兩個int型別的成員,分別是a和b,定義變數是用 struct node st a 這樣的形式.例如,上式就定義了一個名為st a的結構體變數 橙心橙願 比如三個.c檔案一個.h檔案 c 2.c 3.c 4.h這三個標頭檔案...

c語言結構體的定義,C語言結構體的定義

滑映寒愈霽 第二個struct student是定義了一個student結構體,這個明白吧。第一個是用typedef把struct student這個結構體型別名字重新定義為student,也就是說struct student和student表示同一個事物,都是一個型別的識別符號,比如 typede...

c語言中switch結構的使用,C語言中switch結構的使用

秋風依舊好 因為case後面不能接範圍,也就是說case後面是一個確實固定的常量.用下面的方法比較好,include int main 你可以先把範圍用字母或常量代替 再用switch語句 資料 include void main else printf score scanf d s system...