1. c語言中是如何釋放內存單元的;原理又是什麼
C管理內存大致可以理解為兩種,分配在棧上的,一個是分配在堆上的。
臨時變數,動態變數,分配在棧上,運行完,直接彈出棧,就沒了。
分配在堆上的內存,釋放的時候,基本上可以理解為,指針不指這里了。也就失去了對這塊內存的控制。其實所謂的釋放。字面意思容易讓人理解錯。
有些機器有些操作系統,會在釋放的時候清空這段內存,但是這種做法效率不高,但是安全,很少有機器這么做,多數都是所謂釋放,就是不讓你控制這塊內存了而已。
2. C語言數組指針內存釋放
//用指針的指針當二維數組請參考以下代碼
#include<stdio.h>
#include<stdlib.h>
intmain(){
int**b;
b=(int**)malloc(sizeof(int*)*4);//二維數組b有4行
for(inti=0;i<4;i++)//替每行分配存儲空間
b[i]=(int*)malloc(sizeof(int)*3);//二維數組b每行3列
for(inti=0;i<4;++i)for(intj=0;j<3;j++)
b[i][j]=i*j;
for(inti=0;i<4;++i){
for(intj=0;j<3;j++)
printf("%5d",b[i][j]);
printf(" ");
}
for(inti=0;i<4;i++)
free(b[i]);//釋放每行的存儲空間
free(b);//釋放b
return0;
}
3. 關於C語言指針釋放的問題
這段話中有好幾個錯誤。
1. 如果有int A, int *B = &A, 這時執行free(B) 一定引起內存錯誤。
free只能使用在動態分配的內存上,不能用在堆棧或靜態數據上。
類似 int A,或 static int A,這樣的變數定義,是在編譯時已經確定了內存位置。
動態分配是在運行時,從堆中臨時分配的內存塊(用malloc,或new)。這些內存塊需要用 free(malloc)或delete(new)釋放;
2. 變數名實際是內存地址的代稱,這句也不完全對
在程序中,變數名代表了「這個地址上的數值」,只有對變數使用&操作,才能得到變數的地址
3. free(B)應該釋放了B這個指針變數
如果指針變數存放了一個動態得到的地址,free(B)釋放的是變數B的數值(不是變數B的地址),由於變數B的數值是一個動態分配得到的地址,所以free釋放的是動態地址。
4. C語言 指針的釋放問題
前提是這個指針使用malloc、realloc、calloc動態申請來的,當你不使用這個指針時,就釋放掉,在什麼地方釋放都是可以的,關鍵是這個指針沒有被修改過
5. c語言指針怎麼理解,什麼時候會用到指針,要注意哪些方面
cpu自己有運算器和寄存器,通過匯流排與存儲器件相連,在執行運算時,
需要將數據沖存儲器件上面將參與運算的數據讀入,運算完成後再送出到
存儲區。那麼cpu讀入時需要訪問存儲器件的某個單元,需要指定這個單元
的編號,我們管這個編號叫存儲地址。
比如:int a[10],*p; p=&a[3];a就是一個擁有10個整型數據的數據區
的首地址,變數p是存放地址的,稱為指針型變數,賦值時需要取相應存儲
區的地址,p=&a[3];就是取數組a的第4個單元的地址給p,那麼p就拿到了
這個單元的地址,*p=5;就相當於a[3]=5;的操作,p++;後p指針就指向a[4]。
在操作大塊數據時,一般記錄首地址(數組指針),然後根據首地址再加
上偏移量來訪問整個數據,在你程序中寫a[3]時,計算機就會取a數組對應
的首地址再加3個整型偏移量來訪問相應數據。用指針p訪問a數組的好處
是,不用每次計算a加多少偏移訪問數據,而是使p指向某數據後可以p++
或p--來訪問前一個或後一個數據。
注意:
1.指針存放地址用,不是存儲實際數據的,它是用來找數的,在
程序中要注意這點,往往出問題的是,指針還沒有賦值就用來操作,或
用指針來存放數據,如:int *p=15,s[10]={ 0,15,{0} };的
p指針賦值有問題,這樣計算機會把15當成地址存放到p變數中,以後用
*p訪問得到的數據就不是你想要的數據了。(應該類似:p=s+1; *p=15;)
2.指針訪問數據區一般需要程序來控制不要越界,比如定義了10個單元
的數據區,你不能讓指針超出這10個單元的范圍,否則得到的數據就是
不靠譜的。
3.指針的定義只是開設了可以訪問數據區或數組的變數,數據區和數組
需要你的程序另行開設,然後把數據區或數組的某個單元的地址賦值給
指針變數,不要認定義了能訪問數組的指針,數組就定義好了。
4.指針存放的地址最好不要用來與其他地址比較,除非你能確認地址比
較的結果肯定是你想要的。
5.舉例來說,int a[10],*p=a;中a和p都是指針(地址),但a和p是不同的
在編譯器眼中,a是一個數據區的首地址,是一個標記,你程序中使用a
時,編譯器會知道用數據區的首地址來替換操作,而p是你自己程序開
設的變數,可以在程序中操作比如p++; p=a;等,但作為記號的a就不能
在程序中操作了,如a++; a=p;就是錯的了。
6.子程序如果參數是指針型的,這個參數由子程序開設的指針型臨時
變數存儲,這個臨時變數可以進行操作,但不會返回給調用者的指針型
變數。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎麼加減都不會影響p。