C語言動態分配記憶體問題

2021-09-02 07:22:01 字數 712 閱讀 1308

*動態分配記憶體和直接分配記憶體區別

1.直接分配記憶體,如int*p 是分配在棧上的,可以對其初始化

2.動態分配記憶體,int*p=malloc(100)是分配在堆記憶體上的

*free()釋放記憶體問題

free函式只能對動態分配的記憶體進行釋放,釋放後該指標仍保留位址,但是記憶體被釋放,成為野指標,裡面的值是不確定的

所以一般要再次將其p=null;

但是無法釋放直接分配的記憶體,即只能釋放堆上記憶體,無法釋放棧上記憶體如1.

int* p = malloc(400);

q = p;

free(q)

可以釋放q,因為q所指的為動態分配的記憶體(堆上記憶體),釋放後,p和q都變成野指標,最好將他們都賦值為null

2.int a = 100

int *p = &a

free(p)

釋放錯誤,無法釋放不是動態分配的記憶體

在c語言資料結構中,經常看煉表等一系列資料結構的刪除操作,會經常涉及到到free()函式,對一些宣告的指標如:

sqlist *p

p = l              //l是頭結點

free(p)

釋放p會讓人感到疑惑,因為各個節點建立時都進行了動態分配記憶體(為了讓節點中儲存值,必須要對指標進行賦值),所以直接釋放p也就有原因了

C語言動態分配記憶體

動態開闢記憶體的函式 void malloc size t size 這個函式向記憶體申請 塊連續可 的空間,並返回指向這塊空間的指標 如果開闢成功,則返回 個指向開闢好空間的指標 如果開闢失敗,則返回 個null指標,因此malloc的返回值 定要做檢查 返回值的型別是 void 所以malloc...

C語言 關於記憶體動態分配問題

全域性變數 分配到 記憶體的靜態區。區域性變數 非靜態 分配到 記憶體的動態區。在儲存區中稱為棧 stack 臨時資料 c允許記憶體動態分配區域 存放在自由空間區,稱為堆區 heap 記憶體動態分配 得益於四個庫函式實現 malloc calloc free realloc 呼叫庫函式 void 不...

C語言動態分配記憶體知識

陣列的長度必須事先指定,只能是常整數,不能是變數 傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放,只能在定義 該陣列的函式使用完畢後,釋放陣列占用的記憶體。陣列的長度一旦定義,其長度就不能更改。傳統形式定義的陣列不能跨函式使用。動態記憶體分配可以很好的解決傳統陣列的缺點。傳統陣列也被稱之為...