C語言(動態記憶體分配)

2021-09-11 13:23:40 字數 1540 閱讀 8958

c語言記憶體分配:

靜態記憶體:也就是棧空間記憶體,不用程式設計師自己分配。

1、棧區(stack):編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區。棧裡面的變數通常是區域性變數、函式引數等。windows下,棧記憶體分配2m(確定的常數),超出了限制,提示stack overflow錯誤。自動分配,釋放。

動態記憶體分配:由 malloc 等分配的記憶體塊,和堆是十分相似的,不過它是用 free 來結束自己的生命的。

2、堆區(heap):由 new 分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個 new 就要對應乙個 delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。堆可以動態地擴充套件和收縮。 程式設計師手動分配釋放,作業系統80%記憶體。

3、全域性區或靜態區。

4、字元常量區。

5、程式**區。

void main

()複製**

會出現stack overflow錯誤,也就是棧溢位。

void main

()複製**

上面就是使用malloc動態分配sizeof(int)m記憶體,然後使用free釋放分配的記憶體。

動態記憶體分配:在程式執行過程中,動態指定需要使用的記憶體大小,手動釋放,釋放之後這些記憶體還可以被重新使用。

建立乙個陣列,動態指定陣列的大小

void main

() //釋放p

free(p);

getchar();

}複製**

realloc :重新分配記憶體

void main

() int addsize;

printf("輸入陣列增加的長度:");

scanf("%d", &addsize);

//記憶體不夠用,擴大剛剛分配的記憶體空間

int* p2 = realloc(p, (addsize + size)*sizeof(int));

if (p2 == null)

//重新賦值

int j = 0;

printf("\n\n");

for (; j < (size + addsize); j++)

//手動釋放記憶體

if (p != null)

if (p2 != null)

getchar();

}複製**

重新分配記憶體的兩種情況: 1、縮小,縮小的那一部分資料會丟失 2、擴大,(連續的) (1)如果當前記憶體段後面有需要的記憶體空間,直接擴充套件這段記憶體空間,realloc返回原指標; (2)如果當前記憶體段後面的空閒位元組不夠,那麼就使用堆中的第乙個能夠滿足這一要求的記憶體塊,將目前的資料複製到新的位置,並將原來的資料庫釋放掉,返回新的記憶體位址; (3)如果申請失敗,返回null,原來的指標仍然有效。

記憶體分配的幾個注意細節: 1.不能多次釋放 2.釋放完之後(指標仍然有值),給指標置null,標誌釋放完成 3.記憶體洩露(p重新賦值之後,再free,並沒有真正釋放記憶體)

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...

C語言 動態記憶體分配

c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...