【C语言进阶深度学习记录】三十三 C语言中动态内存分配
生活随笔
收集整理的這篇文章主要介紹了
【C语言进阶深度学习记录】三十三 C语言中动态内存分配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如何在程序運行的時候動態給程序分配內存?
文章目錄
- 1 動態內存分配的意義
- 1.1 C語言中如何動態申請內存空間
- 1.2 malloc和free的用法
- 1.3 calloc與realloc
- 1.31 calloc和realloc的代碼案例分析
- 2 總結
1 動態內存分配的意義
在C語言中,一切操作都是基于內存的。變量和數組名都是內存別名。但是它們的內存分配卻是在編譯期間由編譯器決定的。定義數組的長度的時候,必須指定長度,這是在編譯期間就要確定的。
但是,需求總是有的。比如當我們無法在編譯期間確定到底需要多大的內存塊,此時就無法定義數組的大小(或者定義的數組大小不夠)。此時就需要在運行的時候根據實際的情況(比如根據輸入的數據的大小),來動態的申請內存空間,然后讓數組(指針)指向這塊新申請的內存。
這就是動態內存分配的意義。
1.1 C語言中如何動態申請內存空間
- malloc和free用于動態申請內存和釋放內存
它們的操作對象是堆空間內存(內存池)如下圖:
注意:malloc和free必須是成對出現的,這樣可以避免內存泄露。關于內存泄露,后面還有文章進行學習。
1.2 malloc和free的用法
malloc和free的函數定義如下:
- malloc所分配的是一塊連續的內存,參數size是所分配的內存字節數。
- malloc的返回值是void* ,具體使用的時候需要做強制類型轉換
- free用于將申請的動態內存歸還給系統
關于malloc和free,有以下幾點需要注意:
至于malloc和free的用法,在前面的文章已經學會使用了,這里不再給出例子,直接看前面的文章吧:二維數組與二維指針
以及在后面的文章中,會給出一個內存泄露檢測模塊,來鞏固malloc與free的使用。自行去后面的文章查看。
1.3 calloc與realloc
函數原型為;
- calloc的參數:num個類型長度為size的內存空間大小。也就是申請的內存的類型信息(大小和類型)
- calloc會將申請的內存空間初始化為0
- realloc用于修改原先已經分配的內存塊大小
- 當realloc的第一個參數pointer為NULL時,realloc相當于malloc
- realloc一般是重新找一塊新的內存塊進行分配,而不是在原有的內存的結尾增加。
1.31 calloc和realloc的代碼案例分析
- 代碼:38-2.c
- 上述代碼運行結果:
Linux下gcc 4.4.5編譯:
Windows下 VS 2017運行如下:
- 分析:
所以最終總結為:只有calloc胡為分配的內存的內容初始化為0,malloc和realloc都是隨機值。
2 總結
- 動態內存分配使得程序在需要的時候有機會獲得更大的內存
- malloc單純的從系統中申請固定字節大小的內存。內存中的內容是隨機值
- calloc 申請的內存的內容被初始化為0
- realloc用于重置內存的大小。但是是重新在堆空間中選一塊內存而不是在原有的內存后面增加。并且,重置的內存中,原有的內容不變,但是如果內存變大,多余的部分的內存的內容是隨機值。
- 注意上述三者函數的參數與返回類型
- 學會使用上述三者函數
總結
以上是生活随笔為你收集整理的【C语言进阶深度学习记录】三十三 C语言中动态内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aop在项目中的实际运用_mypy在实际
- 下一篇: 【C语言进阶深度学习记录】十二 C语言中