靜態記憶體指的是在編譯時系統自動給其分配的記憶體,運行結束后會自動釋放;靜態記憶體是在堆疊中分配的;
動態記憶體是我們程式員手動分配的記憶體,正常情況下,程式運行結束后,也不會自動釋放,所以為了避免發生未知的錯誤,我們需要手動釋放動態記憶體;動態記憶體是在堆分配的;
- 動態記憶體分配問題:
#include<stdio.h>
#include<malloc.h>//用于呼叫malloc()函式
int main()
{
int i=5;
//為變數 i 靜態分配了4個位元組的記憶體
int *p=(int *)malloc(4);
//將malloc()函式動態分配的4個位元組的記憶體的地址賦給了指標變數 p
*p=5;
//把‘5’放到了指標變數 p 所儲存的地址對應的動態記憶體單元中
printf("%d",*p);
free(p);
//記住在程式結束處一定要將動態分配的記憶體釋放掉,因為正常情況下,動態分配的記憶體是不會隨程式的結束而自動釋放的
//所以為了避免未知的錯誤,在程式結束處,一定要用free()釋放動態記憶體,一個malloc()對應一個free()
}
運行結果:
5
--------------------------------
Process exited after 6.594 seconds with return value 1
請按任意鍵繼續. . .
1.用到動態記憶體分配時,需要呼叫:malloc(int i)函式,該函式儲存在頭檔案<malloc.h>中;malloc()函式只有一個int形參,回傳值為【第一個位元組的地址】;
2.如圖中的(int *)代表將malloc回傳的位元組地址強制為int *型別,至于為什么一定要強制轉換,我的理解是:一個地址,是4個位元組,而我們不知道用戶使用這段malloc()開辟的空間用來儲存什么型別的資料,所以呼叫malloc()函式是,要對其回傳值進行不同型別的強制轉換;
3.void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道用戶是用這段空間來存盤什么型別的資料(比如是char還是int)所以需要 int*強制轉換,說明用來存盤int型別資料!
- 理解動態記憶體的使用:(代碼的目的是將 *p 存的100變為200)
#include<stdio.h>
#include<malloc.h>
void f(int *q)
{
//*p=200; //錯
//q=200; //錯
//**q=200; //錯
*q=200;
//free(q); //錯
}
int main()
{
int *p=(int *)malloc(4);
*p=100;
printf("%d\n",*p);
f(p);
printf("%d\n",*p);
}
運行結果:
100
200
--------------------------------
Process exited after 1.492 seconds with return value 4
請按任意鍵繼續. . .
1.主函式中指標p 指向了一個動態記憶體,(*p=10)代表向p指向的動態記憶體放進了一個“10”;
2.這時printf(*p)自然是p所指向的動態記憶體中所儲存的 “10”
3.流程控制進入子函式f(int *)中,f()先將p所指向的記憶體資料拷貝給了指標q,此時q也指向了動態記憶體中所儲存的”10“,這時如果想改變動態記憶體中的資料,只能對*q進行操作,因為在子函式*p并沒有定義;
4.也不能直接寫”q=20“,因為q是指標,20是int,針型殊途啊;
5.**q更不對了,這種型別是從內向外運算的,q是指標,而*q是變數,而*又只能操作指標型別,所以**q自然屬于語法錯誤;
6.子函式最后也不能free(q),因為我們要printf動態記憶體中的資料,若free(q),此時q所指向的動態記憶體被釋放掉,再printf(*q)輸出的自然是垃圾值(因為此時動態記憶體中沒有手動儲存資料)
博主只是一只小菜雞,若文章有錯誤或不當之處,請狠狠批評博主 (~ ̄(OO) ̄)ブ
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342985.html
標籤:C
上一篇:大一C語言學習筆記(7)---指標篇--什么是指標?什么是指標變數?取地址符“&”的作用是什么?地址運算子“*”的作用是什么,怎么理解兩者?
