分配記憶體在棧中,如果超出分配記憶體的大小,會報stack overflow錯誤。
int a[1024 * 1024 * 10];
1.棧區(statck),windows下,棧記憶體分配確定的常數,超出了限制,就會提示stack overflow錯誤。棧記憶體自動分配,釋放。
2.堆區(heap)
程式設計師手動分配和釋放,可以分配作業系統大概80%的記憶體
3.全域性區或者叫靜態區
4.字元常量區
5.程式**區
float* p = malloc(1024 * 1024 * 10 * sizeof(float));
malloc返回值是void * ,可以是任意型別的指標free()函式釋放記憶體sizeof(int)提公升**可讀性
當程式退出時,作業系統會自動釋放所有分配給程式的記憶體,但是,建議您在不需要記憶體時,都應該呼叫函式 free() 來釋放記憶體。
//動態記憶體分配
float* p = malloc(1024 * 1024 * 10 * sizeof(float));
//釋放
free(p);
realloc() 來增加或減少已分配的記憶體塊的大小
重新分配記憶體的兩種情況
如果是縮小的情況下,縮小的那部分資料會丟失
如果是擴大的情況下
1.如果當前記憶體段後面有需要的記憶體空間,直接擴充套件這段記憶體空間,realloc返回原指標
2.如果當前記憶體段後面的空閒位元組不夠(已經被其他程式所使用了),那麼就使用堆中第乙個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,並將原來的資料庫釋放掉,返回新的記憶體位址。
3.如果申請失敗(沒有那麼大的記憶體),返回null,原來的指標任然有效
int len;
printf("第一次輸入陣列的長度:");
scanf("%d", &len);
int* p = malloc(len * sizeof(int));
//int* p = calloc(len, sizeof(int)); //malloc和calloc作用一樣,colloc不用自己計算,一般使用malloc即可
for (int i = 0; i < len; i++)
int addlen;
printf("輸入陣列增加的長度(可輸入負數,釋放部分記憶體):");
scanf("%d", &addlen);
//擴大剛剛分配的記憶體空間
//引數1.原來記憶體的指標 引數2.記憶體擴大之後的總大小
int* p2 = realloc(p, sizeof(int)*(len + addlen));
if (p2==null)
//重新賦值
for (int i = 0; i < len+addlen; i++)
//手動釋放記憶體
if (p!=null)
if (p2!=null)
分配記憶體的大小是固定的,程式還沒執行的時候,就知道要開闢多大的棧記憶體區域。
缺點: 1. 很容易超出棧記憶體的最大量
2.為了防止記憶體不夠用,會開闢更多的記憶體,容易浪費記憶體
在程式執行過程中動態指定需要使用的記憶體大小,手動釋放,釋放之後,這些記憶體還可以在應用內重新使用。
參考 c 語言教程
C語言記憶體分配
c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...
C語言記憶體分配
c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...
C語言記憶體分配
objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...