C語言動態儲存分配

2021-06-28 04:50:04 字數 1541 閱讀 2954

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

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函式所分配的區域。

【例11-8】分配一塊區域,輸入乙個學生資料。

main()  *ps;

ps=(struct stu*)malloc(sizeof(struct stu));

ps->num=102;

ps->name="zhang ping";

ps->***='m';

ps->score=62.5;

printf("number=%d\nname=%s\n",ps->num,ps->name);

printf("***=%c\nscore=%f\n",ps->***,ps->score);

free(ps);

}本例中,定義了結構stu,定義了stu型別指標變數ps。然後分配一塊stu大記憶體區,並把首位址賦予ps,使ps指向該區域。再以ps為指向結構的指標變數對各成員賦值,並用printf輸出各成員值。最後用free函式釋放ps指向的記憶體空間。整個程式包含了申請記憶體空間、使用記憶體空間、釋放記憶體空間三個步驟,實現儲存空間的動態分配。

動態儲存分配

動態儲存分配 在我們使用記憶體時,堆是一塊很大的記憶體塊,用於執行時分配一些小的儲存空間。c 中動態儲存分配用 new和 delete 分配完記憶體需要判斷分配是否成功 分配了新的記憶體空間,舊資料塊的資料拷貝到新的空間中,舊的記憶體需要釋放以便其他部分需要新記憶體塊的時候可以使用,如果沒有釋放就會...

動態儲存分配

malloc函式 void malloc size t n 分配n個位元組的記憶體單元,分配成功,返回記憶體單元的首位址。分配失敗,返回null。calloc函式 void calloc size t nmemb,size t size 分配nmemb個 每個大小為size 的記憶體單元,記憶體單元...

靜態儲存分配和動態儲存分配

通常定義變數或者物件,編譯器在編譯時都可以根據該變數或物件的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確定的儲存空間,這種記憶體分配被稱為靜態儲存分配。有些操作物件只有在程式執行時才能確定,這樣編譯器在編譯時就無法為他們預定儲存空間,只能在程式執行時,系統根據執行時的要求進行記憶體...