記憶體區包括:棧區、堆區、全域性區或靜態區、**區;
棧區(stack)是由編譯器自動分配釋放,存放函式呼叫、引數值、區域性變數的值等;
//棧區分析
#includechar* getstr()
int main()
; //strcpy(buf, getstr())
//printf("buf = %s\n", buf);
char *p;
p=getstr();
printf("p = %s\n", p); //亂碼,不確定
return 0;
}
堆區(heap)是一般由程式設計師分配釋放,c語言允許建立記憶體動態分配區域,以存放一些臨時資料的自由儲存區;
//堆區分析
#include#include#includechar* getstr()
int main()
; //strcpy(buf, getstr())
//printf("buf = %s\n", buf);
char *p = null, *q;
p=getstr();
if(p != null)
p = null;
return 0;
}
全域性區或靜態區(static)是全域性變數和靜態變數的儲存區,初始化和未初始化分開放置;字串常量和其他常量的儲存位置,程式結束後由作業系統釋放;
//全域性變數區分析,相同字串常量位址相同
#includechar* getstr1()
char* getstr2()
int main()
**區:儲存函式體的二進位制**。
記憶體的動態分配是通過系提供的庫函式實現的,主要有malloc,calloc,free,realloc這4個函式。
malloc函式原型為void *malloc(unsigned int size);其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。形參size的型別定為無符號整型(不允許是負數)。此函式的值是分配區域的第乙個位元組的位址。如果此函式未能程成功的執行則返回空指標null。
calloc函式原型為void *calloc(unsigned n,unsigned size);其作用是在記憶體的動態儲存區中分配n個長度為size的連續空間,足以儲存陣列。函式返回指向所分配區域的起始位置的指標,如果分配不成功,返回null。
free函式原型為void free(void *p);其作用是釋放變數p所指向的動態空間。
但是這段記憶體使用者還是可以訪問到的,只是該記憶體的值可能已經發生了變化。
realloc函式原型為void *realloc(void *p,unsigned int size);將已經通過malloc函式或calloc函式獲得的動態空間重新分配
以上函式宣告需要#include標頭檔案宣告。
一維動態陣列實現
//一次性分配陣列
int *array,n; //定義指標及陣列個數
array = (int *)malloc(sizeof(int)*n) //動態分配一維陣列
//未知數組個數,多次分配陣列
str = (char*)malloc(sizeof(char));
str = (char*)realloc(str, sizeof(char)*n); //重新分配
//釋放記憶體,指標指向並沒有變
free(str);
str = null;
二維動態陣列實現
//calloc實現
int m,n
array=(int **)calloc(m,sizeof(int*));
for(i=0;iarray[i]=(int *)calloc(n,sizeof(int));
//malloc實現
int m,n
array=(int **)malloc(sizeof(int *)*m);
for(i=0;iarray[i]=(int *)malloc(sizeof(int)*n);
//釋放記憶體
for(i = 0; i < n; i++)
}if(array)
C語言之記憶體使用
問題 記憶體使用 有人寫了乙個將整數轉換為字串的函式 char itoa int n 如果我呼叫這個函式 char str5 itoa 5 str5會是什麼結果呢?答案分析 答案是不確定,可以確定的是肯定不是我們想要的 5 retbuf定義在函式體中,是乙個區域性變數,它的記憶體空間位於棧 stac...
深入C語言之記憶體問題
最近瘋狂學習c語言當中,看到有啟蒙文章,心中大喜,隨複製。記憶體,c語言中出現詭異bug的兩大 源泉 之一。即使是久經沙場的老手,也有時也難免落入陷阱。本文將涉足這個雷區,一 竟。本人菜鳥乙隻,屬於初探,不敢深挖。記憶體分為哪些段?一般來說,c語言中記憶體分為 棧 stack 堆 heap 全域性變...
C語言之記憶體分配函式
include include include intmain printf n free pm pm null int pc pc int calloc 100,sizeof int printf 使用calloc分配的儲存空間 n for int i 0 i 100 i printf n fre...