1. 程式人生 > >關於malloc(0)的返回值問題--這兩天的總結與實踐篇

關於malloc(0)的返回值問題--這兩天的總結與實踐篇

就像我在http://www.cnblogs.com/wuyuegb2312/p/3219659.html 文章中評論的那樣,我也碰到了被提問這個malloc(0)的返回值問題,雖然感覺這樣做在實際中沒有任何意義,但既然被提問到了,那總得給點答覆。當時的回答是“返回一個NULL指標”。

就像@五嶽檢視man結果的一樣,我也查看了,malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is not cleared. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().這句話翻譯起來,就是傳個0的話,返回值要麼是NULL,要麼是一個可以被free呼叫的唯一的指標。那是不是這篇文章中說的,通過這句話“

if(int pp = (strlen(ptr=(char *)malloc(0))) == 0)

”來判斷是不是NULL指標呢?當然,實際情況到底如何,還得看程式碼。

剛看到“malloc(0)唯一不同的地方就是,就算你申請記憶體成功,即malloc(0)返回值不為NULL,你也沒法使用這塊記憶體。”那到底是不是就沒法使用呢?

我的測試程式碼:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

int alloc_memory(char
*p , int size) { printf("\nbefore malloc %p\n",p); p = (char *)malloc(size); if(!p) { printf("malloc error \n"); return -1; } //len of malloc(0) printf("len of malloc(%d) is %d ,the ture is %d\n",size,strlen(p),malloc_usable_size(p));
//the first member printf("the first member of malloc(%d) is %p:%d \n",size,p,*p); //set the first member *p = 10; printf("set the first member of malloc(%d) is %p:%d \n",size,p,*p); //memcpy memset(p,'\0',12); memcpy(p,"01234567890123456789",12); printf("after memcpy , the content is %s len is %d , the ture is %d \n",p,strlen(p),malloc_usable_size(p)); free(p); p = NULL; printf("\n"); } int main(int argc ,char **argv) { int size = -1; char *p = NULL; //malloc(0) size = 0; alloc_memory(p,size); //malloc(5) size = 5; alloc_memory(p,size); //malloc(20) size = 20; alloc_memory(p,size); return 0; }

測試結果如下:

[email protected]:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/EXERCISE$ gcc -o malloc malloc.c 
[email protected]:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/EXERCISE$ ./malloc               

before malloc (nil)
len of malloc(0)  is  0  ,the ture is 12
the first member of malloc(0) is 0x9e78008:0 
set the first member of malloc(0) is 0x9e78008:10 
after memcpy , the content is 012345678901len is 15  , the ture is 12 


before malloc (nil)
len of malloc(5)  is  0  ,the ture is 12
the first member of malloc(5) is 0x9e78008:0 
set the first member of malloc(5) is 0x9e78008:10 
after memcpy , the content is 012345678901len is 15  , the ture is 12 


before malloc (nil)
len of malloc(20)  is  0  ,the ture is 20
the first member of malloc(20) is 0x9e78018:0 
set the first member of malloc(20) is 0x9e78018:10 
after memcpy , the content is 012345678901   len is 12  , the ture is 20 

[email protected]:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/EXERCISE$ 

從測試結果來看,可以得出以下幾個結論:

1. malloc(0)在我的系統裡是可以正常返回一個非NULL值的。這個從申請前列印的before malloc (nil)和申請後的地址0x9e78008可以看出來,返回了一個正常的地址。

2. malloc(0)申請的空間到底有多大不是用strlen或者sizeof來看的,而是通過malloc_usable_size這個函式來看的。---當然這個函式並不能完全正確的反映出申請記憶體的範圍。

3. malloc(0)申請的空間長度不是0,在我的系統裡它是12,也就是你使用malloc申請記憶體空間的話,正常情況下系統會返回給你一個至少12B的空間。這個可以從malloc(0)和malloc(5)的返回值都是12,而malloc(20)的返回值是20得到。---其實,如果你真的呼叫了這個程式的話,會發現,這個12確實是”至少12“的。

4. malloc(0)申請的空間是可以被使用的。這個可以從*p = 10;及memcpy(p,"01234567890123456789",12);可以得出。

雖然malloc(0)沒有發現在現實中有什麼意義,但是既然有些人非要我們回答,那我們還是有必要探究一下的,否則你只有被pass掉了。關於這個問題的討論很值得,因為它讓我對技術更加感興趣,不經意間學到了其他的知識。

如果大家有什麼不同意見,歡迎跟帖討論,謝謝!

注:---後為新增內容。

總結:為了安全起見,malloc(0)的非NULL返回值,最好不要進行除了free()之外的任何操作!

非常感謝garbageMan playerc 求道於盲 五嶽 懶得想一個好名字 等同仁的參與教導,小弟12年自動化專業剛畢業,知識面尚淺薄,以後有什麼問題,還望部落格園的各位不吝賜教,謝謝!

相關推薦

關於malloc(0)的返回問題--總結實踐篇

就像我在http://www.cnblogs.com/wuyuegb2312/p/3219659.html 文章中評論的那樣,我也碰到了被提問這個malloc(0)的返回值問題,雖然感覺這樣做在實際中沒有任何意義,但既然被提問到了,那總得給點答覆。當時的回答是“返回一個NULL指標”。 就像@五嶽檢視man

面試的總結--搜狐,愛奇藝

自身因素:            由於實驗室,不允許出去實習,所以我沒有準備春招。非常後悔,因此,不管自己實驗室允不允許暑假出去實現,3、4月份的春招一定要參加,即使沒有面試上,也能為秋招準備面試經驗。應聘崗位:演算法工程師搜狐武漢            圖形影象演算法工程師

【OC學習-8】存取器方法?getter和setter?事實上就是賦返回種函數

trac -m main 都是 protect pro 聲明 return 安全 我們在聲明類的時候,有實例變量+方法(函數),這些實例變量假設默認的話都是protected類型,一般無法直接訪問。更別提賦值和調用了,所以就產生了兩種函數,ge

整合高德的一些功能

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="

,聽說幾何畫板把事情搞大了!

進入11月份,讓人激動的事情莫過於雙十一了,這幾年火起來的電商節,確實撈金不少。這不,擱誰也不會放過這樣的好機會。就連人教版指定使用的教育軟體——幾何畫板,也按捺不住了。 這個雙十一,如果一定要剁手,買買買,那麼別再沉迷於化妝品/衣服之類的了,今年,就讓我們來點不一樣的吧!

折線圖返回---每一

null pan col 線圖 ifnull spa 折線 tel between SELECT A.datelist AS pick_dt, IFNULL(B.pick_cnt, 0) pick_cnt, IFNULL(B.cust_cd, 0) cust_cd

還在讀x86保護模式的天書了,不過閒暇寫了個二進位制字串轉化為二進位制數的幼稚程式。

 當然是方便自己查那些什麼特權級,描述符,粒度位,段屬性之類的資訊了。 #include <stdio.h> #include "const.h" //#include "global.h" //#include "proc.h" //#include "protec

物理機沒了br0,怎麼辦——記錄咋瘋的。。。

最近發生了一個很尷尬的情況,就是在開啟電腦後發現物理機中ip addr show中沒有了br0。 先開始還沒反應過來,直到當我想要開啟虛擬機器時,才發現虛擬機器因為物理機中沒有了br0,虛擬機器無法開啟。這個就非常尷尬了,畢竟很多操作直接上物理機上,本人還是感覺很虛的。 經過百度、以及向他人

運維小白的總結

  寒冷的冬季鄙人吃著冰棍懷著熱切的心來到了北京,拋卻了去看各種小姐姐的想法悶教室裡學習運維。當看到運維這倆字時腦海裡就飄過幾個大大的問號,什麼是運維?執行維護唄!嗯!我們就是虛擬世界的維修工(小生自己的想法,若有不同求請教!)而操作一般都是負責Linux伺服器的配置,維護,監控,調優

,上海吹起一股“極棒”風……

“極棒”? “很贊”? very good? 如果你能親臨現場,就能明白小編我絕對所言非虛,剛剛結束的GeekPwn2018國際安全極客大賽真如其名“極棒”一般著實精彩! 據瞭解,比賽以“人‘攻’智慧,洞見未來”為主題,主要通過集結最強黑客戰隊,預演智慧裝置及人工智慧

研究FastMM在BCB下的應用,小有心得

李維先生在Blog中說到Delphi 2006中將使用FastMM做記憶體管理,效率可以提高10%-300%。心嚮往之,到FastMM的主頁看了一下,只是針對Delphi系列的IDE和應用程式做的,只提供給BCB一個小的介面,還不能Uninstall。但是還是可以使用的,只要

說到的蘋果軟體中毒是個什麼情況?

今天逛微博,看到了有人發現 apple 手機中的部分軟體存在盜取賬戶資訊的問題,網上搜羅了下資訊,把大概的原因和處理方案說下。本文的闡述會比較淺顯易懂。 如何被感染的 大家對這些盜取賬戶資訊的行為稱之為手機中毒,簡單的說就是使用的軟體中被非軟體方通過某些手段植入了程式本不該有的程式碼,這些程式碼可以獲取使

工作中遇到的問題,先記下,回頭整理

tar用法 http://blog.csdn.net/mmllkkjj/article/details/6768294/ http://apps.hi.baidu.com/share/detail/37384818 download ADT link http://dl.g

除錯環信的心得

一.整合就不多說了,官方文件都有的,可以自己去看: 整合進來有一個小的問題就是設定暱稱和頭像。 1、在登入的時候,把自己登入成功時後臺返回的資訊儲存到sharedpreferences中,需要包含需要的頭像和暱稱。 new Thread(new

模擬了下....杯具了

政治:48 英語:43.5 數學:88 計算機基礎綜合:71  總分:250........(囧rz) 丟人丟到家了,後面兩門居然能做成這個樣子..........還有那個很囧的總分 我果然是一個“杯具”

在Ubuntu12.04.1安裝jdk1.7/MyEclipse10/Jboss-as-7.1.1/Oracle11g遇到的種種問題記錄下來

9、資料庫的問題先不管了,在MyEclipse 10.1,整合Jboss7應用伺服器進行網站開發,但是出現一個問題,就是修改jsp內容後必須重新部署一遍應用專案才能在Firefox下看出剛才修改的變化,這實在是太麻煩了,不知道是什麼原因,,,,,還在摸索解決中

【shell】獲取函式返回種方法

方法一: 使用全域性變數 g_result="" function testFunc() { g_result='local value' } testFunc echo $g_resu

Julia : 終於1.0了,來得有點久

昨天看著出0.7,今天看到出了1.0。 一切有點急,一切感覺又有點晚。0.7試了一下,沒有庫跟上,現在1.0估計也沒有庫能跟上。先玩著吧,我自己的東東大部分的依賴庫還在0.6水平,只能等等了。下了一個0.6.4版本當備用,這算有回退的方案吧。 一、1.0 有點

對坦克(百度之星的坦克大戰)做了些修改

    以前在預測到的位置開槍後沒打中敵人的話,我還會守在那裡再打。就是為了防止敵人因為要對付我的預測而停頓一回合。守在那個地方打到底對於敵人的反預測有沒有效果我不知道,因為我一直以來都在拿瘋狂坦克作為我改進的物件。結果我發現對於瘋狂坦克,這樣的戰術不但沒作用(理所當然,瘋狂

看了關於王石的本書

  又是2天沒有上來寫了。  趁著週末看了《道路與夢想-我與萬科20年》和《王石這個人》兩本關於王石的書。看了以後,感想頗深。王石從32歲開始到深圳後開始了自己事業的起點,中間也經歷了許多的困難和挫折。但是在中間。王石他仍然能夠堅持自己的原則來做事,這是多麼難得的事呢?  王