c 結構體,既記憶體分配

2021-06-28 03:55:48 字數 2823 閱讀 6877

說明結構變數有以下三種方法。以上面定義的stu為例來加以說明。

1) 先定義結構,再說明結構變數。

如:

struct

stu;

struct

stu boy1,boy2;

說明了兩個變數boy1和boy2為stu結構型別。

也可以用巨集定義使乙個符號常量來表示乙個結構型別。例如:

#define stu struct

stustu

;stu

boy1,boy2;

2) 在定義結構型別的同時說明結構變數。

例如:

struct

stuboy1,boy2;

這種形式的說明的一般形式為:

struct 結構名變數名表列;

3) 直接說明結構變數。

例如:

struct

boy1,boy2;

這種形式的說明的一般形式為:

struct變數名表列;

第三種方法與第二種方法的區別在於第三種方法中省去了結構名,而直接給出結構變數。三種方法中說明的boy1、boy2變數都具有下圖所示的結構。

說明了boy1、boy2變數為stu型別後,即可向這兩個變數中的各個成員賦值。在上述stu結構定義中,所有的成員都是基本資料型別或陣列型別。成員也可以又是乙個結構,即構成了巢狀的結構。例如,下圖給出了另乙個資料結構。

按圖可給出以下結構定義:

struct

date

;struct

boy1,boy2;

首先定義乙個結構date,由month(月)、day(日)、year(年) 三個成員組成。在定義並說明變數 boy1 和 boy2 時,其中的成員birthday被說明為data結構型別。成員名可與程式中其它變數同名,互不干擾。

在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。

c語言中不允許動態陣列型別。

例如:

int n;

scanf

("%d"

,&n);

int a[n];

用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資料,而無法預先確定。對於這種問題,用陣列的辦法很難解決。為了解決上述問題,c語言提供了一些記憶體管理函式,這些記憶體管理函式可以按需要動態地分配記憶體空間,也可把不再使用的空間**待用,為有效地利用記憶體資源提供了手段。

常用的記憶體管理函式有以下三個。

1) 分配記憶體空間函式malloc

呼叫形式:

(型別說明符*)malloc(size)

功能:在記憶體的動態儲存區中分配一塊長度為"size"位元組的連續區域。函式的返回值為該區域的首位址。

例如:pc=(char *)malloc(100);

表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標,把該指標賦予指標變數pc。

2) 分配記憶體空間函式 calloc

calloc 也用於分配記憶體空間。呼叫形式:

(型別說明符*)calloc(n,size)

功能:在記憶體動態儲存區中分配n塊長度為「size」位元組的連續區域。函式的返回值為該區域的首位址。

例如:ps=(struet stu*)calloc(2,sizeof(struct stu));

其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首位址賦予指標變數ps。

3) 釋放記憶體空間函式free

呼叫形式:

free(void*ptr);

功能:釋放ptr所指向的一塊記憶體空間,ptr是乙個任意型別的指標變數,它指向被釋放區域的首位址。被釋放區應是由malloc或calloc函式所分配的區域。

c語言不僅提供了豐富的資料型別,而且還允許由使用者自己定義型別說明符,也就是說允許由使用者為資料型別取「別名」。型別定義符typedef即可用來完成此功能。例如,有整型量a、b、其說明如下:

int a,b;

其中int是整型變數的型別說明符。int的完整寫法為integer,為了增加程式的可讀性,可把整型說明符用typedef定義為:

typedef int integer

這以後就可用integer來代替int作整型變數的型別說明了。例如:

integer a,b;

它等效於:

int a,b;

用typedef定義陣列、指標、結構等型別將帶來很大的方便,不僅使程式書寫簡單而且使意義更為明確,因而增強了可讀性。例如:

typedef char name[20];   

表示name是字元陣列型別,陣列長度為20。然後可用name 說明變數,如:

name a1,a2,s1,s2;

完全等效於:

char a1[20],a2[20],s1[20],s2[20]

又如:

typedef

struct

stu stu;

定義stu表示stu的結構型別,然後可用stu來說明結構變數:

stu body1,body2;

typedef定義的一般形式為:

typedef 原型別名  新型別名

其中原型別名中含有定義部分,新型別名一般用大寫表示,以便於區別。

有時也可用巨集定義來代替typedef的功能,但是巨集定義是由預處理完成的,而typedef則是在編譯時完成的,後者更為靈活方便。

C語言結構體的記憶體分配

原則一 結構體中元素按照定義順序存放到記憶體中,但並不是緊密排列。從結構體儲存的首位址開始 每乙個元素存入記憶體中時,它都會認為記憶體是以自己的寬度來劃分空間的,因此元素存放的位置一定會在自己大小的整數倍上開始。原則二 在原則一的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素長度的整數倍。若...

結構體的記憶體分配

記憶體大小和系統有關,如32位系統和64位系統,同一資料型別,記憶體分配大小不一 假設這台機器是sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同的時候,用的是同一塊記憶體 在預設情況下,規定各成員變數的起始位址相對於結構的...

結構體的記憶體分配

假設這台機器 sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同是時候,用的是同一塊記憶體 在預設情況下,vc規定各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的 位元組數的倍數。下面列出常用型...