亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學(xué)習(xí)啦>學(xué)習(xí)英語>專業(yè)英語>計(jì)算機(jī)英語>

      c語言中realloc函數(shù)的用法

      時(shí)間: 長思709 分享

        c語言中realloc函數(shù)的用法的用法你知道嗎?下面小編就跟你們詳細(xì)介紹下c語言中realloc函數(shù)的用法的用法,希望對你們有用。

        c語言中realloc函數(shù)的用法的用法如下:

        在C語言中,良好的編程習(xí)慣要求一個(gè)函數(shù)只做一件事,如果一個(gè)函數(shù)實(shí)現(xiàn)了若干功能,可以說基本是一個(gè)糟糕的設(shè)計(jì)。

        C語言 realloc() 函數(shù)位于 stdlib.h 頭文件中,其原型為:

        void *realloc(void *ptr, size_t size);

        realloc() 會(huì)將 ptr 所指向的內(nèi)存塊的大小修改為 size,并將新的內(nèi)存指針返回。

        設(shè)之前內(nèi)存塊的大小為 n,如果 size < n,那么截取的內(nèi)容不會(huì)發(fā)生變化,如果 size > n,那么新分配的內(nèi)存不會(huì)被初始化。

        如果 ptr = NULL,那么相當(dāng)于調(diào)用 malloc(size);如果 size = 0,那么相當(dāng)于調(diào)用 free(ptr)。

        如果 ptr 不為 NULL,那么他肯定是由之前的內(nèi)存分配函數(shù)返回的,例如 malloc()、calloc()或realloc()。

        如果 ptr 所指的內(nèi)存塊被移動(dòng),那么會(huì)調(diào)用 free(ptr)。

        看吧,一個(gè)簡單的 realloc() 卻賦予了好幾個(gè)功能,這并不是良好的函數(shù)設(shè)計(jì)。估計(jì)也是為了兼容性,才容忍這個(gè)函數(shù)一直在C庫中。雖然在編碼中,realloc() 會(huì)提供一定的方便,但是也很容易引發(fā)Bug。

        下面就舉兩個(gè)例子,來說明一下。

        1) realloc() 第一種行為引發(fā)的Bug

        01.void *ptr = realloc(ptr, new_size);

        02.if (!ptr) {

        03. // 錯(cuò)誤處理

        04.}

        這里就引出了一個(gè)內(nèi)存泄露的問題,當(dāng)realloc() 分配失敗的時(shí)候,會(huì)返回NULL。但是參數(shù)中的 ptr 的內(nèi)存是沒有被釋放的。如果直接將realloc()的返回值賦給ptr。那么當(dāng)申請內(nèi)存失敗時(shí),就會(huì)造成ptr原來指向的內(nèi)存丟失,造成內(nèi)存游離和泄露。

        正確的處理應(yīng)該是這樣:

        01.void *new_ptr = realloc(ptr, new_size);

        02.if (!new_ptr) {

        03. // 錯(cuò)誤處理。

        04.}

        05.ptr = new_ptr

        2) 第三種行為引發(fā)的Bug

        實(shí)際上,malloc(0)是合法的語句,會(huì)返還一個(gè)合法的指針,且該指針可以通過free去釋放。這就造成了很多人對realloc()的錯(cuò)誤理解,認(rèn)為當(dāng)size為0時(shí),實(shí)際上realloc()也會(huì)返回一個(gè)合法的指針,后面依然需要使用free去釋放該內(nèi)存。

        01.void *new_ptr = realloc(old_ptr, new_size);

        02.//其它代碼

        03.free(new_ptr);

        由于錯(cuò)誤的認(rèn)識,不去檢驗(yàn)new_size是否為0,還是按照new_size不為0的邏輯處理,最后并free(new_ptr)。這里就引入了double free的問題,造成程序崩潰。

        所以,realloc() 這個(gè)設(shè)計(jì)并不怎么優(yōu)良的函數(shù)陷阱還是不少的,一不小心就踩雷了,上面只是兩個(gè)簡單的小例子,大家在實(shí)際使用的時(shí)候還應(yīng)該注意一些其他小問題。

      c語言中realloc函數(shù)的用法

      c語言中realloc函數(shù)的用法的用法你知道嗎?下面小編就跟你們詳細(xì)介紹下c語言中realloc函數(shù)的用法的用法,希望對你們有用。 c語言中realloc函數(shù)的用法的用法如下: 在C語言中,良好的編程習(xí)慣要求一個(gè)函數(shù)只做一件事,如果一個(gè)函數(shù)實(shí)現(xiàn)了
      推薦度:
      點(diǎn)擊下載文檔文檔為doc格式
      533336