在指針的傳遞中,也涉及到傳值與傳址的問題。下面經過一個函數進行說明。函數
代碼以下:spa
bool openBinary(uchar* buffer) { long lSize = 1024; buffer = (uchar*)malloc(sizeof(uchar)*lSize); return true; }
int main(int agrc, char *agrv[]){
uchar *buffer_0 = NULL;
openBinary(buffer_0);
return 0;
}
在上面的代碼中,執行過openBinary函數後,buffer_0依然是一個空指針。指針
緣由是由於執行openBinary函數時,函數生成了一個值與buffer_0相同的uchar*臨時變量buffer,在分配內存前,臨時變量buffer和buffer_0的值相同,但在分配內存後,動態分配的內存地址賦值給了臨時變量buffer。今後刻開始,臨時變量buffer的值和buffer_0的值就不同了,buffer_0依然是一個空指針,而臨時變量buffer指向了新分配內存的首地址。openBinary函數執行完畢後,臨時變量buffer被銷燬,成爲buffer_0的一個過客,而buffer曾指向的內存也不知所向,最後buffer_0一無所得。code
若是像讓buffer_0最終得到內存,在函數調用時就須要傳址而非傳值。blog
代碼以下:內存
bool openBinary(uchar* &buffer) { long lSize = 1024; buffer = (uchar*)malloc(sizeof(uchar)*lSize); return true; } int main(int agrc, char *agrv[]){ uchar *buffer_0 = NULL; openBinary(buffer_0); return 0; }
上述代碼中,openBinary函數中傳入了buffer_0的引用,在動態內存的分配中,buffer_0是真實參與其中的,函數執行事後,buffer_0是能夠得到內存的。class
最後注意,內存使用完畢後要進行釋放。變量