c語言函數內爲外部分配空間問題

在很多情況下我們都會把關於一些內存的操作的步驟給封裝起來,這樣會帶來很大的好處,方便我們使用,下面談一個經常可能會犯的低級錯誤。這種情況是假如我想把初始化某一部分的操作封裝成這樣的函數void Init(char* p) 很有可能我們會這樣做:
void Init(char* p) {
          p = (char *) malloc(sizeof(char)*MAX);
          .........
}

其實這樣的做法是錯誤的,如果這樣寫的話,你和下面的代碼又有什麼區別呢?

void Init(int a) { int b = 0; a = b;}

有人說 有區別阿 我分配了內存空間,並且賦值給p了啊?  我們可以這樣想一下malloc 以後返回的值不就是一個變量嗎?其實和b 是一樣的 只不過是一個指針變量而已,其實還是一個變量而已。 那個 Init( char* p)  這裏面的p其實只是在外部調用的那個char指針的一個變量拷貝而已,你在函數體對這個變量的賦值是不會對被拷貝的那個char指針變量產生任何影響的,就像很經典的指針傳值問題一樣。 那麼有人問我該怎麼在函數體內對外部指針變量進行空間分配呢? 我們可以參考一下以前經典的指針傳值嘛,對指針變量進行操作修改是一樣的嘛,聰明的人馬上就會想到  加個地址不就完了麻,對 正確的寫法如下所示:

void Init(char** p) { 
          *p = (char *)malloc(sizeof(char)*MAX); 
              .............
}


這樣寫纔是正確的,而第一種只會產生內存泄漏。請大家不要犯這樣低級的錯誤。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章