安全起見,小心使用C語言realloc 函式

2021-07-22 20:57:57 字數 1766 閱讀 2954

在c語言中,良好的程式設計習慣要求乙個函式只做一件事,如果乙個函式實現了若干功能,可以說基本是乙個糟糕的設計。

c語言 realloc() 函式位於 stdlib.h 標頭檔案中,其原型為:

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

void *  意思是這個函式返回的是指標變數。 void * ptr傳遞進去的是指標變數

realloc() 會將 ptr 所指向的記憶體塊的大小修改為 size,並將新的記憶體指標返回。

設之前記憶體塊的大小為 n,如果 size < n,那麼擷取的內容不會發生變化

,如果 size > n,那麼新分配的記憶體不會被初始化。

如果 ptr = null,那麼相當於呼叫 malloc(size);如果 size = 0,那麼相當於呼叫 free(ptr)。雖然指標被free掉,但是指向null;

如果 ptr 不為 null,那麼他肯定是由之前的記憶體分配函式返回的,例如 malloc()、calloc()或realloc()。

如果 ptr 所指的記憶體塊被移動,那麼會呼叫 free(ptr)。

看吧,乙個簡單的 realloc() 卻賦予了好幾個功能,這並不是良好的函式設計。估計也是為了相容性,才容忍這個函式一直在c庫中。雖然在編碼中,realloc() 會提供一定的方便,但是也很容易引發bug。

下面就舉兩個例子,來說明一下。

1) realloc() 第一種行為引發的bug

void

*ptr =

realloc

(ptr, new_size); //用這個函式的時候不能返回值賦值給自己。要用第三者代替。

if(!ptr)

這裡就引出了乙個記憶體洩露的問題,當realloc() 分配失敗的時候,會返回null。但是引數中的 ptr 的記憶體是沒有被釋放的。如果直接將realloc()的返回值賦給ptr。

那麼當申請記憶體失敗時,就會造成ptr原來指向的記憶體丟失,造成記憶體游離和洩露。

經常這樣連貫著用:

void

*new_ptr =

realloc

(ptr, new_size);

if(!new_ptr)

ptr = new_ptr

2) 第三種行為引發的bug

實際上,malloc(0)是合法的語句,會返還乙個合法的指標,且該指標可以通過free去釋放。這就造成了很多人對realloc()的錯誤理解,認為當size為0時,實際上realloc()也會返回乙個合法的指標,後面依然需要使用free去釋放該記憶體。

純文字

複製

void

*new_ptr =

realloc

(old_ptr, new_size);

//其它**

free

(new_ptr); 用完還是要釋放

由於錯誤的認識,不去檢驗new_size是否為0,還是按照new_size不為0的邏輯處理,最後並free(new_ptr)。這裡就引入了double free的問題,造成程式崩潰。

所以,realloc() 這個設計並不怎麼優良的函式陷阱還是不少的,一不小心就踩雷了,上面只是兩個簡單的小例子,大家在實際使用的時候還應該注意一些其他小問題。

如果你希望更加深入和透徹地學習程式設計,請了解

vip會員、

c語言一對一輔導、

c++一對一輔導。

c語言隱式型別轉換 小心!

今天查乙個和rtp協議有關的bug,不是我寫的,如果是我寫很有可能也會犯這個錯誤。為了對應這個問題,我先是把網上關於rtp協議的部落格又大致看了一遍,然後有把出錯的函式的功能簡單過了一遍。又把除錯資訊列印了一遍。最後基本確定是隱式型別轉換的問題,不需要做什麼大的改動。因為是前人寫的 理解和修改都得小...

360安全衛士 使用強制解除安裝工具要小心

2010年08月27日下午 3 00 多的時候,看到桌面上面有一款 雙視影院 因為很耗效能也很佔記憶體,只要已開啟,整個機子就會卡死掉,無奈之下只好進行刪除,很久以來都是使用的360安全衛士裡面自帶的強制解除安裝工具,當時在解除安裝的時候,我還在納悶吶,怎麼360安全衛士這次怎麼解除安裝的這麼徹底啊...

新手小心 c語言中強符號與弱符號的使用

c語言的強符號和弱符號是c初學者經常容易犯錯的地方。而且很多時候,特別是多人配合開發的程式,它引起的問題往往非常行為怪異而且難以定位。什麼是強符號和弱符號?在c語言中,函式和初始化的全域性變數是強符號,未初始化的全域性變數時弱符號。強符號和弱符號的定義是聯結器用來處理多重定義符號的,它的規則是 不允...