C語言的動態記憶體分配與void指標型別

2021-08-23 14:16:39 字數 2438 閱讀 7216

目錄:

1.什麼是動態記憶體分配

2.怎麼動態記憶體分配和釋放

3.void指標型別

參考資料:

[1]譚浩強. c程式設計(第四版)[j]. 計算機教育, 2010, no.128(20):113-113.

1.什麼是動態記憶體分配

1)全域性變數的記憶體空間分配在靜態儲存區

2)非靜態的區域性變數(包括函式形參)分配在記憶體中的動態儲存區,這個區域稱為棧stack區域。

c允許建立記憶體的動態分配區域,以存放一些臨時用的資料,這些資料不必在程式的宣告部分定義,也不必等待函式結束才釋放,

需要是由使用者隨時開闢,不需要時隨時釋放。這些資料是臨時存放在乙個特別的自由儲存區,稱為堆heap區。由於未在宣告部分定義他們未變數或陣列,因此不能通過變數名或陣列名去訪問這些資料,只能通過指標來訪問。

2.怎麼動態記憶體分配和釋放:

對記憶體的動態分配是通過系統提供的庫函式來實現的,主要有malloc、calloc、free、realloc這4個函式,它們宣告在stdlib.h標頭檔案中:

#include

1)

void* malloc(unsigned int size);
在堆區分配size個位元組大小的連續的記憶體區域,並返回所分配區域的第乙個位元組的位址,分配不成功則返回null(空指標)。

2)

void* calloc(unsigned int n, unsigned int size);
在堆區分配n個大小為size個位元組的連續記憶體空間區域,函式返回指向所分配區域的起始位置的指標!分配不成功則返回null(空指標)。

calloc函式可以為一維陣列開闢動態儲存空間,n為陣列元素個數,每個元素大小為size個位元組。這就是動態陣列。

例如:

int * p = (int*)calloc(50, sizeof(int));//開闢50*4個位元組的臨時儲存區域,把起始位址賦給指標變數p

p[0] = 1;

p[1] = 2;

cout << p[0] << "," << p[1] << endl;

3)

void* realloc(void* p, unsigned int size);
將p指標所指向的記憶體空間的大小改為size個位元組,p值不變,如果重新分配不成功,則返回null

如果已經通過malloc()或calloc()函式獲得了動態儲存空間,想要改變它的大小,可以用realloc()函式。

4)

void free(void* p);
釋放指標變數p所指向的已經分配的動態記憶體空間,注意是釋放已經分配了的記憶體空間。重複釋放將編譯報錯!

c99標準將以上4個函式的基型別定義為void型別,這種指標稱為無型別指標(typeless pointer):

即不指向哪一種具體的資料型別,只表示用來指向乙個抽象的型別的資料,即近提供乙個純位址,而不能指向任何具體的物件!

int a = 3;

int* p1 = &a;

char* p2;

void* p3;//p3為無型別的指標變數,基型別為void型

p3 = (void*)p1;

p2 = (char*)p3;

cout << "*p1=" << *p1 << endl;

//cout << "*p3=" << *p3 << endl;//錯誤:非法的間接定址!

cout << "*p2=" << *p2 << endl;//輸出acsii字元表的3代表的字元?!vs下是個方框!

/**p1=3

*p2=

*/p3 = &a;

//cout << "*p3=" << *p3 << endl;//錯誤:p3是無指向了,不能指向a

// c_malloc_void.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include#include//void* malloc(unsigned int size);

////void* calloc(unsigned int n, unsigned int size);

////void free(void* p);

////void* realloc(void* p, unsigned int size);

using namespace std;

int _tmain(int argc, _tchar* argv)

/*輸出:

*p1=3

*p2=

請按任意鍵繼續. . .

c語言的動態記憶體分配與void指標型別

void型別與動態記憶體分配

void型別的使用 1 當函式不需要返回值時就使用void來定義,例如 void max int a,int b 2 當函式不需要引數時使用,void max void void指標型別 它不指向任何資料型別。void p,int q,int a p a 其他型別賦值給void型別,不用強制轉換,系...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言靜態記憶體分配與動態記憶體分配

c語言中,記憶體主要分為5個區,分別為棧區 堆區 全域性 靜態儲存區 常量儲存區 區。其中 區存放源程式的二進位制 其餘四個區都儲存程序執行過程中需要的儲存的變數。變數的記憶體分配有兩種 靜態與動態。靜態記憶體分配在編譯時就對變數分配空間,而動態記憶體分配直到程式執行時再進行分配。使用靜態記憶體分配...