商務英語計算機英語

c語言中realloc函數的用法

本文已影響 1.08W人 

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

ing-bottom: 75%;">c語言中realloc函數的用法

  c語言中realloc函數的用法的用法如下:

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

C語言 realloc() 函數位於 stdlib.h 頭文件中,其原型爲:

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

realloc() 會將 ptr 所指向的內存塊的大小修改爲 size,並將新的內存指針返回。

設之前內存塊的大小爲 n,如果 size < n,那麼截取的內容不會發生變化,如果 size > n,那麼新分配的內存不會被初始化。

如果 ptr = NULL,那麼相當於調用 malloc(size);如果 size = 0,那麼相當於調用 free(ptr)。

如果 ptr 不爲 NULL,那麼他肯定是由之前的內存分配函數返回的,例如 malloc()、calloc()或realloc()。

如果 ptr 所指的內存塊被移動,那麼會調用 free(ptr)。

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

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

1) realloc() 第一種行爲引發的Bug

*ptr = realloc(ptr, new_size);

(!ptr) {

03. // 錯誤處理

04.}

這裏就引出了一個內存泄露的問題,當realloc() 分配失敗的時候,會返回NULL。但是參數中的 ptr 的內存是沒有被釋放的。如果直接將realloc()的返回值賦給ptr。那麼當申請內存失敗時,就會造成ptr原來指向的內存丟失,造成內存遊離和泄露。

正確的處理應該是這樣:

*new_ptr = realloc(ptr, new_size);

(!new_ptr) {

03. // 錯誤處理。

04.}

= new_ptr

2) 第三種行爲引發的Bug

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

*new_ptr = realloc(old_ptr, new_size);

02.//其它代碼

(new_ptr);

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

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

猜你喜歡

熱點閱讀

最新文章