C++中的傳值與傳址

在指針的傳遞中,也涉及到傳值與傳址的問題。下面經過一個函數進行說明。函數

代碼以下: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

最後注意,內存使用完畢後要進行釋放。變量

相關文章
相關標籤/搜索