大一C語言學習筆記(8)---指針篇--動態內存是什么?與靜態內存有什么區別?怎么使用動態內存,有什么需要注意的地方?


靜態內存指的是在編譯時系統自動給其分配的內存,運行結束后會自動釋放;靜態內存是在棧中分配的;

動態內存是我們程序員手動分配的內存,正常情況下,程序運行結束后,也不會自動釋放,所以為了避免發生未知的錯誤,我們需要手動釋放動態內存;動態內存是在堆分配的;


  • 動態內存分配問題:
#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) ̄)ブ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM