目錄
靜態開闢空間是固定的,陣列在申明的時候必須指定陣列的長度,在編譯的時候分配記憶體,但是我們在實際情況中對於記憶體空間的需求,不僅僅是上述的情況,有時候我們需要的空間只有在執行之後才能知道,所以需要開闢乙個動態記憶體空間,滿足更多需求。
void* malloc (size_t size);
malloc函式是向記憶體申請一塊連續的空間,並返回指向這塊空間的指標,如果開闢成功則指向開闢好的空間,如果開闢失敗,則返回null,所以在使用之前要對開闢的空間進行乙個判斷。malloc函式的返回值是void*,所以在具體使用的時候可以由我們來指定。
給乙個int型陣列開闢動態空間
int *p=(int *)malloc(sizeof(int)*n);
(int *)給malloc強轉一下,之後我們給陣列開闢空間,可以用sizeof(int)*n這樣我們就可以只改變n的大小。
我們也程式設計客棧可以給乙個結構體開闢動態空間
//假設結構體名為student
student *ptr=(student *)malloc(sizeof(student));
void free (void* ptr);
當我們給變數開闢了動態空間後使用完需要進行釋放,否則有可能會出現記憶體洩漏的問題。
釋放的時候就是在使用完整個變數後fvuvhyapzree掉
free( p);
free(ptr);
我們將空間釋放後指標其實還指向的是原來的空間,只是內部儲存的資料全部釋放了,所以為了防止形成野指標,我們要在free的後面講指標賦為空。
free( p);
p=null;
free(ptr);
ptr=null;
當然釋放過的空間不能重複釋放
free( p);
free( p);
free( p);
這樣是會報錯的,不能重複釋放乙個已經釋放的空間
但是下面這樣是可以的,將指標所指的位址變為空
free( p);
p=null;
free( p);
void* calloc (size_t num, size_t size)
calloc函式的功能是為num個大小為size的元素開闢一塊空間,它的作用和malloc相似,但是calloc與malloc函式不同之處在於,他可以在開闢空間的同時把空間的每個位元組初始化為0。
用法和malloc函式一致
int *p=(int *)calloc(10,sizeod(int));
釋放的時候也與malloc函式一致
free( p);
p=null;
所以我們要對申請的記憶體空間初始化時,可以直接使用calloc函式
void* realloc (void* ptr, size_t size)
我們有時會發現之前申請的空間太大或者太小的不合vuvhyapz適的時候,就可以利用realloc函式對動態開闢的空間進行調整,realloc函式的出現也讓動態記憶體管理更加的靈活。
int *p=(int *)malloc(sizeof(int)*10);
p=(int *)realloc(p,sizeof(int)*20);空間改大
p=(int *)realloc(p,sizeof(int)*5);空間改小
空間改大改小都是可以的
realloc函式的實質其實是另外開闢乙個更大或者更小的空間,將原來的數複製過去,複製過去之後再將原來的空間釋放掉,所以會保留原本的資料。
int *ptr=(int *)malloc(100);
int *p=null;
p=(int *)realloc(ptr,20);
if (p != null)
free(ptr);
ptr=null;
在實際運用時將新開闢的空間賦給乙個新的變數可以更好地保護程式,因為如果新的空間開闢失敗了我們也不會將原本的空間丟失,還能將原本的空間保留。
本文標題: c語言動態記憶體函式詳解
本文位址: /ruanjian/c/425692.html
C語言 動態記憶體分配詳解
c語言 動態記憶體分配詳解 動態記憶體分配涉及到堆疊的概念程式設計客棧 堆疊是兩種資料結構。堆疊都程式設計客棧是資料項按序排列的資料結構,只能在一端 稱為棧頂 top 對資料項進行插入和刪除。棧 作業系統 由作業系統自動分配釋放 www.cppcns.com,存放函式的引數值,區域性變數的值等。其操...
C語言動態記憶體分配函式
目錄 1.malloc 2.free 3.calloc 4.realloc 5.小結 在c中我們開闢記憶體空間有兩種方式 1.靜態開闢記憶體 例如 int a int b 10 這種開闢記憶體空間的特點是 所開闢的記憶體是在棧中開闢的固定大小的 如a是4位元組 陣列b是40位元組 並且陣列在申明時必...
C語言 動態記憶體
動態記憶體 動態的建立記憶體,申請記憶體空間為變數 存放於堆區,不能通過變數名或陣列名引用,只能通過指標引用,在windows中,堆中最大的連續記憶體塊為1.3g左右。標頭檔案 includemalloc 在空閒記憶體中分配連續記憶體,約等於2g,分配成功時返回乙個指向該記憶體塊的指標即第乙個位元組...