c語言 malloc_C語言快速入門——動態內存分配

在前面一系列的字符串操作中,我們都是先定義一個固定大小的字符數組,然后根據所需,或拷貝、或連接、或格式化來為這個數組提供內容。固定大小的數組意味著在程序運行期間,數組所占用的內存是確定的(即劃分了固定數量的內存),很多時候,這種方式簡單好用。但是由固定二字也可以看到,這種方式也讓它失去了靈活性。

假定我們現在要從磁盤上加載了一個新聞文件,那么,我們應該定義一個多大的字符數組才能保證完全容納新聞內容呢?顯然,這個大小很難確定。小了,內容會讀取不全;大了,會浪費更多的內存。假如說我們有方法獲得新聞內容的長度,然后分配同等大小的緩沖區(即字符數組),這該多完美!這便是動態內存分配一展身手的地方了。

malloc:動態分配指定數量的存儲空間

b130cccf3a572a027aacba80fc689995.png
87fc919f6f81896beb6421fc66c04ee0.png

我們秉承的是由簡單到復雜的原則,因此這個示例僅用于說明malloc函數的使用。對于這種僅分配一個整數的情況,使用malloc完全不劃算,不如直接定義一個變量簡單好用。

free:釋放malloc分配的存儲空間

拋開虛擬內存等機制,計算機系統內存是有限的,如4GB、8GB。malloc用于向系統申請一定數量的內存,如果你的程序一味的申請內存供自己使用,那么系統可分配給其它程序的內存就會減少,到最后無內存可用,最終導致系統運行緩慢,不穩定等問題。顯然,這種只索取不奉獻的行為是不可取的因此,C語言提供了free函數,用于向系統返還借用的內存。

當你忘記使用free釋放由malloc分配的內存時,表明程序存在”內存泄露“這一頑疾,因此對于上面的程序,我們在return 0之前,使用下面的代碼進行完善。

1ce91c4c11f60c36baf0d962ec94bb35.png

動態數組

在實際開發中,像第一個示例那樣為單個數據動態分配內存的情況很少見。更多時候,我們是分配一整塊內存空間供程序使用。一整塊所暗含的另一個意思就是這塊內存區域中的地址是連續的,這一整塊數據區域也可以稱為緩沖區(buffer)。現在讓我們回過頭來解決文章開始提出的問題。

d67a4629ed53aee3704dfbac944fd829.png

新聞的內容長度是58個字節,這是我提前使用strlen()測試出來的。因為C語言要求字符串必須以'0'結尾,因此我們在使用malloc分配內存時多分配了一個字節,用以存儲這個標記。strcpy_s在拷貝完成后,會在目標串(message)后追加結束標記,因此不需要手動設置標記。

你可以嘗試將例子中lengt+1全部變為length,再次運行時程序會中斷,因為分配的緩沖太小了——只能夠存儲字符串,不能夠存儲最后一位結束符標記。

d2bde11df0c133a93bd3b2df883fbbec.png

最后要說明的是:事實上malloc返回的地址類型是void*,但是在C語言環境中,可以由一個確切的類型直接持有此地址,如

int *pa = malloc(sizeof(int));

但是,通常為了通用性,建議將返回類型強制轉換為對應的類型:

int *pa = (int*)malloc(sizeof(int));

這便是內存動態分配了!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455716.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFMPEG設置 cbr討論

Q:我采用ffmpeg調用x264一直出錯,命令如下ffmpeg -s 352x288 -r 50 -pix_fmt yuv420p -i tmp.yuv tmp.h264可不可以給點建議,找了很久也沒有找到解決辦法,錯誤時error while opening encoder for output stream 0.0 maybe incorrect parame…

博文聲明

本博客用于分享學習筆記 歡迎大神指正,我們互相學習交流,共同成長進步! 博客首頁:秋葉夏風的博客

【經驗分享】工程開發與Coding規范

今天分享分為兩部分 :) PART01 工程開發代碼規范分享/ PART02 關于某易云自動簽到聽歌分享- 5Mins DevCoding Rule: PART 1 了解真實工程開發🏗..... 本篇內容分享的宗旨: 學長工作經驗之談僅作分享🏷 Ready,Go 代碼管理——工具篇 ?工程上首先需要…

過濾器與攔截器區別

過濾器與攔截器區別 參考:http://www.cnblogs.com/dreamroute/p/4198087.html?utm_sourcetuicool 過濾器 過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。它是隨你的web應用啟動而啟動的,只初始化一次,以后就…

二進制-高效位運算

數獨 數獨是介紹位運算的好例子,運用位運算和不運用效率差別還是挺大的。我們先看數獨需求: 1、當前數字所在行數字均含1-9,不重復 2、當前數字所在列數字均含1-9,不重復 3、當前數字所在宮(即3x3的大格)數字均含1-9&a…

pytorch resnet50_PyTorch終于能用上谷歌云TPU,推理性能提升4倍,我們該如何薅羊毛?...

曉查 發自 凹非寺量子位 報道 | 公眾號 QbitAIFacebook在PyTorch開發者大會上正式推出了PyTorch 1.3,并宣布了對谷歌云TPU的全面支持,而且還可以在Colab中調用云TPU。之前機器學習開發者雖然也能在Colab中使用PyTorch,但是支持云TPU還是第一次…

x264里的2pass指的是什么意思? x264源代碼分析2.encode()

A:x264里的2pass指的是什么意思?另外stat是什么意思, 比如有個參數--stats <string> Filename for 2 pass stats [/"%s/"]/n", defaults->rc.psz_stat_out );stats在這是什么意思? 2pass是2次編碼的意思&#xff0c;stats是統計文檔的名稱&a…

項目啟動居然如此重要!

項目的啟動階段比較短&#xff0c;項目經理往往容易忽視這個階段&#xff0c;但是&#xff0c;項目的啟動卻具有著重要的意義。 定基調&#xff1a; 基調包括工作的節奏、團隊氛圍和溝通風格等。 一首歌的第一句決定了這首歌的基調&#xff0c;如何唱好這第一句就是項目啟動所要…

mysql數據庫導入導出文件sql文件

window下 1.導出整個數據庫 mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名 mysqldump -u dbuser -p dbname > dbname.sql 2.導出一個表 mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名 mysqldump -u dbuser -p dbname users> dbname_users.sql 3.導出…

Android Studio主題設置、顏色背景配置

2019獨角獸企業重金招聘Python工程師標準>>> color-themes 效果展示 打開http://color-themes.com/有很多樣式可供選擇 1. Monokai Sublime Text 3(color theme) 2. Solarized Light (color theme) 3. Visual Studio 2015 Dark(color theme) 導入方式 下載主…

JavaScript中的函數

js函數 *第一種是使用function語句定義函數 function abc(){alert(abc); }*第二種是在表達式中定義函數 var 函數名 function\(參數1&#xff0c;參數2&#xff0c;…\){函數體};//例如&#xff1a;//定義var add function\(a,b\){return ab;}//調用函數document.write\(a…

x264源代碼分析1。fread()

相關說明:1. 使用版本: x264-cvs-2004-05-11 2. 這次的分析基本上已經將代碼中最難理解的部分做了闡釋,對代碼的主線也做了剖析,如果這個主線理解了,就容易設置幾個區間,進行分工閱讀,將各個區間擊破了. 3. 需要學習的知識:a) 編碼器的工作流程.b) H.264的碼流結構,像x264_sp…

在centos下安裝pycrypto報錯 RuntimeError: autoconf error

解決&#xff1a;yum -y install gcc File "/usr/lib64/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/usr/lib64/python3.6/distutils/command/build.py", line 135, in run self.run_command(cm…

Java多線程實現異步調用

在Java平臺,實現異步調用的角色有如下三個角色&#xff1a;調用者、 提貨單 、真實數據&#xff0c;一個調用者在調用耗時操作,不能立即返回數據時,先返回一個提貨單 .然后在過一斷時間后憑提貨單來獲取真正的數據.去蛋糕店買蛋糕&#xff0c;不需要等蛋糕做出來(假設現做要很長…

sql server 2008 r2卸載重裝_免費下載:Intouch軟件、Windows操作系統、SQL數據庫,VB6.0、C#...

為大家整理了常用的Windows操作系統和安裝軟件&#xff0c;基本上都是經過我們項目測試OK的版本&#xff0c;以后項目調試就齊全了&#xff0c;不用再“東奔西走”&#xff0c;“小鹿亂撞”了。整理不易&#xff0c;若對您有幫助請關注并轉發&#xff0c;以便幫助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar簡介 ToolBar是Android 5.0推出的一個新的導航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、靈活性、具有Material Design風格等優點&#xff0c;越來越多的應用也用上了ToolBar&#xff0c;比如常用的知乎軟件其頂部導航欄正是使用ToolBar。官方考慮…

【零散積累】傳輸文件(sz/rz/scp命令)

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 01> 傳輸文件&#xff08;sz/rz/scp命令&#xff09; 工作中的傳輸文件會出現在linux之間&#xff0c;或者linux與windows之間。 一、怎么實現linux與windows之間的文件傳輸&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成將已編碼數據參數和待編碼數據裝入到h->mb.cache中,下圖是BUF中存儲的數據在以MB為單位的時候的存儲順序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode&#xff0c;non_zero_count加載進來&#xff0c…

U(優)盤安裝FreeBSD-9.0+GNOME_lite桌面

貼圖在我的主頁&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修訂于&#xff1a;2012/07/04 標題&#xff1a;U(優)盤安裝FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0啟動XP(Windows)、FreeBSD、Ubuntu(Linux)三系統 【黑括號表示說明&#xff0c;中…

【零散積累】 vim常用操作

類型 操作 含義 刪除 dd 刪除游標所在的一整行(常用) ndd n為數字。刪除光標所在的向下n行&#xff0c;例如20dd則是刪除光標所在的向下20行 d1G 刪除光標所在到第一行的所有數據 dG 刪除光標所在到最后一行的所有數據 d$ 刪除光標所在處&#xff0c;到該…