C語言之記憶體分割槽與動態陣列

2021-10-03 21:19:02 字數 2593 閱讀 8990

記憶體區包括:棧區、堆區、全域性區或靜態區、**區;

棧區(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()

**區:儲存函式體的二進位制**。

記憶體的動態分配是通過系提供的庫函式實現的,主要有malloccallocfreerealloc這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...