關於用malloc函式申請0位元組記憶體的進一步討論——《C語言深度解剖》筆記
阿新 • • 發佈:2019-01-24
環境:vs2008
關於malloc和free:
malloc兩次,free一次會記憶體洩漏,當時無現象,但機子會越來越慢;malloc一次、free兩次肯定會出錯。如下:
另外,對NULL可無數次的free。至於為什麼,我認為free對於NULL無意義,所以free不free無所謂。如果讓我來設計free函式,也這樣設計,讓那些蛋疼的人去糾結這樣的問題,⊙﹏⊙b 《C語言深入解剖》P124 “另位還有一個問題:用malloc函式申請0位元組記憶體會返回NULL指標嗎? 可以測試一下,也可以去查詢關於malloc函式的說明文件。申請0位元組記憶體,函式並不返回NULL,而是返回一個正常的記憶體地址,但是你卻無法使用這塊大小為0的記憶體。這好比尺子上的某刻度,刻度本身並沒有長度,只有某兩個在一起才能量出長度。對於這一點一定要小心,因為這時候if(NULL!=p)語句校驗將不起作用。“ 不是無法使用,而是不能使用,(貌似差不多啊⊙﹏⊙b汗)就是你可以往這個地址存資料,但是可能就被後面別的記憶體分配語句分配掉給別的變數,就有被覆蓋掉的可能。
經實驗所得,當你申請大小為0的記憶體,不存資料,然後再free它是沒有問題的;
另外,對NULL可無數次的free。至於為什麼,我認為free對於NULL無意義,所以free不free無所謂。如果讓我來設計free函式,也這樣設計,讓那些蛋疼的人去糾結這樣的問題,⊙﹏⊙b 《C語言深入解剖》P124 “另位還有一個問題:用malloc函式申請0位元組記憶體會返回NULL指標嗎? 可以測試一下,也可以去查詢關於malloc函式的說明文件。申請0位元組記憶體,函式並不返回NULL,而是返回一個正常的記憶體地址,但是你卻無法使用這塊大小為0的記憶體。這好比尺子上的某刻度,刻度本身並沒有長度,只有某兩個在一起才能量出長度。對於這一點一定要小心,因為這時候if(NULL!=p)語句校驗將不起作用。“ 不是無法使用,而是不能使用,(貌似差不多啊⊙﹏⊙b汗)就是你可以往這個地址存資料,但是可能就被後面別的記憶體分配語句分配掉給別的變數,就有被覆蓋掉的可能。
char *cp=(char *)malloc(0); *cp= 'q'; //cp=0x0039210,看到存進去'q'了,就是ASCII為0x71
經實驗所得,當你申請大小為0的記憶體,不存資料,然後再free它是沒有問題的;
char *cp=(char *)malloc(0);
free(cp);
當你往裡面存了一個數據之後再free掉這個指標,就報錯了~~~
char *cp=(char *)malloc(0);
*cp= 'q'; //cp=0x0039210,為啥vs2008每次都分的這個啊?不是在棧裡隨機的麼?看來編譯器設計時不是設定隨機的。
free(cp); //最好不要沒事就來挑戰編譯器的智商