c语言 malloc_C语言快速入门——动态内存分配
在前面一系列的字符串操作中,我們都是先定義一個(gè)固定大小的字符數(shù)組,然后根據(jù)所需,或拷貝、或連接、或格式化來為這個(gè)數(shù)組提供內(nèi)容。固定大小的數(shù)組意味著在程序運(yùn)行期間,數(shù)組所占用的內(nèi)存是確定的(即劃分了固定數(shù)量的內(nèi)存),很多時(shí)候,這種方式簡單好用。但是由固定二字也可以看到,這種方式也讓它失去了靈活性。
假定我們現(xiàn)在要從磁盤上加載了一個(gè)新聞文件,那么,我們應(yīng)該定義一個(gè)多大的字符數(shù)組才能保證完全容納新聞內(nèi)容呢?顯然,這個(gè)大小很難確定。小了,內(nèi)容會(huì)讀取不全;大了,會(huì)浪費(fèi)更多的內(nèi)存。假如說我們有方法獲得新聞內(nèi)容的長度,然后分配同等大小的緩沖區(qū)(即字符數(shù)組),這該多完美!這便是動(dòng)態(tài)內(nèi)存分配一展身手的地方了。
malloc:動(dòng)態(tài)分配指定數(shù)量的存儲(chǔ)空間
我們秉承的是由簡單到復(fù)雜的原則,因此這個(gè)示例僅用于說明malloc函數(shù)的使用。對于這種僅分配一個(gè)整數(shù)的情況,使用malloc完全不劃算,不如直接定義一個(gè)變量簡單好用。
free:釋放malloc分配的存儲(chǔ)空間
拋開虛擬內(nèi)存等機(jī)制,計(jì)算機(jī)系統(tǒng)內(nèi)存是有限的,如4GB、8GB。malloc用于向系統(tǒng)申請一定數(shù)量的內(nèi)存,如果你的程序一味的申請內(nèi)存供自己使用,那么系統(tǒng)可分配給其它程序的內(nèi)存就會(huì)減少,到最后無內(nèi)存可用,最終導(dǎo)致系統(tǒng)運(yùn)行緩慢,不穩(wěn)定等問題。顯然,這種只索取不奉獻(xiàn)的行為是不可取的因此,C語言提供了free函數(shù),用于向系統(tǒng)返還借用的內(nèi)存。
當(dāng)你忘記使用free釋放由malloc分配的內(nèi)存時(shí),表明程序存在”內(nèi)存泄露“這一頑疾,因此對于上面的程序,我們在return 0之前,使用下面的代碼進(jìn)行完善。
動(dòng)態(tài)數(shù)組
在實(shí)際開發(fā)中,像第一個(gè)示例那樣為單個(gè)數(shù)據(jù)動(dòng)態(tài)分配內(nèi)存的情況很少見。更多時(shí)候,我們是分配一整塊內(nèi)存空間供程序使用。一整塊所暗含的另一個(gè)意思就是這塊內(nèi)存區(qū)域中的地址是連續(xù)的,這一整塊數(shù)據(jù)區(qū)域也可以稱為緩沖區(qū)(buffer)。現(xiàn)在讓我們回過頭來解決文章開始提出的問題。
新聞的內(nèi)容長度是58個(gè)字節(jié),這是我提前使用strlen()測試出來的。因?yàn)镃語言要求字符串必須以'0'結(jié)尾,因此我們在使用malloc分配內(nèi)存時(shí)多分配了一個(gè)字節(jié),用以存儲(chǔ)這個(gè)標(biāo)記。strcpy_s在拷貝完成后,會(huì)在目標(biāo)串(message)后追加結(jié)束標(biāo)記,因此不需要手動(dòng)設(shè)置標(biāo)記。
你可以嘗試將例子中l(wèi)engt+1全部變?yōu)閘ength,再次運(yùn)行時(shí)程序會(huì)中斷,因?yàn)榉峙涞木彌_太小了——只能夠存儲(chǔ)字符串,不能夠存儲(chǔ)最后一位結(jié)束符標(biāo)記。
最后要說明的是:事實(shí)上malloc返回的地址類型是void*,但是在C語言環(huán)境中,可以由一個(gè)確切的類型直接持有此地址,如
int *pa = malloc(sizeof(int));
但是,通常為了通用性,建議將返回類型強(qiáng)制轉(zhuǎn)換為對應(yīng)的類型:
int *pa = (int*)malloc(sizeof(int));
這便是內(nèi)存動(dòng)態(tài)分配了!
總結(jié)
以上是生活随笔為你收集整理的c语言 malloc_C语言快速入门——动态内存分配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: verilog实现格雷码(Gray Co
- 下一篇: 您的apple id 暂时不符合使用此应