1. 程式人生 > >關於用malloc函式申請0位元組記憶體的進一步討論——《C語言深度解剖》筆記

關於用malloc函式申請0位元組記憶體的進一步討論——《C語言深度解剖》筆記

環境: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汗)就是你可以往這個地址存資料,但是可能就被後面別的記憶體分配語句分配掉給別的變數,就有被覆蓋掉的可能。
         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);     //最好不要沒事就來挑戰編譯器的智商