• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦>學習英語>專業英語>計算機英語>

    c語言中realloc函數的用法

    時間: 長思709 分享

      c語言中realloc函數的用法的用法你知道嗎?下面小編就跟你們詳細介紹下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

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

      02.if (!ptr) {

      03. // 錯誤處理

      04.}

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

      正確的處理應該是這樣:

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

      02.if (!new_ptr) {

      03. // 錯誤處理。

      04.}

      05.ptr = new_ptr

      2) 第三種行為引發的Bug

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

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

      02.//其它代碼

      03.free(new_ptr);

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

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

    c語言中realloc函數的用法

    c語言中realloc函數的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中realloc函數的用法的用法,希望對你們有用。 c語言中realloc函數的用法的用法如下: 在C語言中,良好的編程習慣要求一個函數只做一件事,如果一個函數實現了
    推薦度:
    點擊下載文檔文檔為doc格式
    533336 主站蜘蛛池模板: 亚洲av女人18毛片水真多| 国产凸凹视频一区二区| 国产伦精品一区二区三区无广告 | 无翼乌口工全彩无遮挡里| 国产国产人免费人成免费视频| 亚洲va久久久噜噜噜久久天堂| 一个人看的日本www| 青楼18春一级毛片| 日本人与动zozo| 国产一区二区精品在线观看| 亚洲av日韩精品久久久久久久| 久热中文字幕在线精品免费| xxxx69中国| 老扒的幸福时光| 抬头见喜全集免费版| 国产又粗又大又爽又黄| 亚洲一级片在线观看| 97色精品视频在线观看| 欧美综合区自拍亚洲综合绿色| 国产香蕉一区二区在线网站| 免费a级毛片无码av| avtt天堂在线| 欧美日韩国产精品自在自线| 国产精品乱码在线观看| 亚洲精品偷拍无码不卡av| 一级做a爰片性色毛片中国| 色吊丝最新在线播放网站| 成人免费淫片在线费观看| 国产乱子伦在线观看| 久久精品国内一区二区三区| 青青青手机视频| 日韩国产成人精品视频人| 国产精品亚洲аv无码播放| 乱人伦人妻精品一区二区| 夜夜未满18勿进的爽影院| 毛片a级毛片免费观看免下载| 女人扒开屁股爽桶30分钟| 午夜dj在线观看免费高清在线| jizz国产丝袜18老师美女| 理论片手机在线观看免费视频| 国产边摸边吃奶叫床视频|