動態記憶體建立與釋放

2021-08-19 04:36:11 字數 3364 閱讀 7690

使用時應加上標頭檔案 #include

一.申請動態記憶體

申請動態記憶體:malloc/calloc/realloc,申請的動態記憶體分為多少份此函式無法明確,所以應在malloc/calloc/realloc前面加上型別

1.malloc

malloc函式的形參為所要申請的動態記憶體位元組數(動態陣列總共所佔位元組數)

,若申請成功,此函式會將申請的動態連續記憶體(動態陣列)的首位址返回,申請失敗返回空指標。

例如:int *p1=(int *)malloc(20);       //申請20個位元組的記憶體,型別為int 每個int所佔位元組數為4,所以此陣列可放5個int變數

free(p1);                                     //釋放掉這20個位元組的記憶體

int *p2=(double *)malloc(32);      //申請32個位元組的記憶體,型別為double 每個double所佔位元組數為8,所以此陣列可放5個double變數

free(p2);

int *p3=(char *)malloc(10);   //申請10個位元組的記憶體,型別為char 每個char所佔位元組數為1,所以此陣列可放10個char變數

free(p3);

動態記憶體在堆裡,它突破了區域性變數的作用域和生存期,如果申請動態記憶體成功,只有free函式或程式執行結束,否則此段記憶體始終可以使用,它突破區域性變數的作用域和生存期。

例:

#include #include int *show1()

; return arr1;

} int *show2()

return arr2;

}int main()

printf("\n\n\n\n\n");

int *p2=show2();

for(i=0;i<5;i++)

free(p2);

return 0;

}

結果:

calloc(陣列長度,陣列每乙個單元格所佔位元組數)

calloc與malloc區別:申請的動態陣列會初始化為0;

例:

#include #include int main()

for(i=0;i<10;i++)

printf("\n\n\n\n");

//等同以下操作

int *arr2 = (int *)calloc(10,sizeof(int));//10為陣列長度,每乙個單元格佔4位元組

for(i=0;i<10;i++)

free(arr1);

free(arr2);

return 0;

}

結果:

修改動態陣列的大小。

當擴大動態陣列的大小時,會重新申請一塊記憶體(此時所需要的記憶體總位元組數),再將舊記憶體中的內容複製到新的記憶體中,釋放掉舊記憶體,將新記憶體的首位址賦給儲存舊記憶體首位址的指標,將申請新記憶體時儲存新首位址的指標置空。

當縮小動態記憶體的大小時,無操作。

realloc(舊記憶體的首位址,此時所需要的記憶體總位元組數);

例:1.擴大動態記憶體:

#include #include int main()

p1 = (int *)realloc(p1,20*sizeof(int));//將動態陣列的長度修改為20(共80位元組)

for(i=0;i<10;i++)

free(p1);

printf("\n\n\n\n\n");

//下面的**等同realloc

int *p2 = (int *)malloc(10*sizeof(int));

for(i=0;i<10;i++)

int *q = (int *)malloc(20*sizeof(int));

for(i=0;i<10;i++)

p2 = q;

q = null;

for(i=0;i<10;i++)

free(p2);

return 0;

}

結果:

2.縮小動態記憶體

#include #include int main()

printf("縮小記憶體前%d\n",p);

for(i=0;i<10;i++)

printf("\n\n\n\n\n");

p = (int *)realloc(p,5*sizeof(int));

printf("縮小記憶體後%d\n",p);

for(i=0;i<10;i++)

free(p);

printf("\n釋放動態記憶體後%d\n",p);

return 0;

}

結果:

二.釋放動態記憶體

釋放動態記憶體:free

free(

動態記憶體首位址

)使用完動態記憶體後要用free釋放掉申請的動態記憶體,否則會造成記憶體洩漏(可使用的記憶體越來越少),釋放掉動態記憶體後要將儲存原動態記憶體首位址的指標置空,此時此段記憶體已被作業系統**,這個指標為野指標。

free崩潰的原因:

1.越界

例:

int main()

free(p);

return 0;

}

2.修改指標指向

例;

int main()

free(p);

return 0;

}

3.重複釋放同一段記憶體

例;

int main()

int *q = (int *)malloc(20*sizeof(int));

for(int i=0;i<10;i++)

free(p);

p = q;

free(p);

free(q);// 應將q = null;

return 0;

}

4.釋放非動態記憶體

例:

int main()

動態記憶體的分配與釋放

1.new與delete運算 c 提供了兩個中重要的運算子 new和delete。由於他們是運算子不是函式,因此執行效率更高。運算子功能 目結合性 用法new 動態分配 單目自右向左 new type new動態分配陣列 單目自右向左 new type delete 釋放空間 單目自右向左 dele...

C語言之動態記憶體分配與釋放

1,堆記憶體特點 堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。2,堆大小 堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。1,malloc函式 2,calloc函式 3,realloc函式 4,free函式 示例 include include int m...

動態記憶體會被自動釋放嗎?

函式體內的區域性變數在函式結束時自動消亡。很多人誤以為示例 7 6是正確的。理由是 p是區域性的指標變數,它消亡的時候會讓它所指的動態記憶體一起完蛋。這是錯 覺!void func void 我們發現指標有一些 似是而非 的特徵 1 指標消亡了,並不表示它所指的記憶體會被自動釋放。2 記憶體被釋放了...