2017-04-05 179 views
-2

錯誤功能的realloc():無效指針爲什麼我的簡單代碼不能在C++中工作?

int indZero = 0; 

int *perZero=NULL; 

int zero = 0;//Initialization 


ProcessBit(zero,&indZero,&perZero);// Call function 

void ProcessBit(int num,int *ind,int **mas) 

{ 

mas=(int**)realloc(&mas,((*ind))*sizeof(int));// Error 

mas[num-1]++;//it's correct line 

} 
+0

另外,這段代碼不在C++中,它在C中。 –

回答

3

的幾個問題:

  • 的第一個參數realloc原始指針(或NULL)。

  • 您的ProcessBit沒有真正模擬正確的傳遞引用。

  • 您可以使用否定的索引。

  • mas是指向int的指針,但將其用作指向int的指針。

「固定」 版本可能是這個樣子:現在

void ProcessBit(int num, int *ind, int **mas) 
{ 
    int *temp = realloc(*mas, (*ind + 1) * sizeof(int)); 
    if (temp == NULL) 
    { 
     // TODO: Handle error 
     // TODO: return or exit(EXIT_FAILURE) 
    } 

    *mas = temp; 

    (*mas)[*ind] = 0; // Initial initialization 

    if (num > 0) 
    { 
     (*mas)[num - 1]++; 
    } 

    ++*ind; // Increase the size 
} 

,如果這真的是C++(如你標記你的問題),那麼你應該使用std::vector相反,它會用簡單得多的代碼來解決幾乎所有的問題。

0

參數錯誤。既然你試圖重新分配一個NULL指針,它應該像malloc一樣行爲;然而,在cstdlib聲明的標題是

void* realloc(void* ptr, std::size_t new_size); 

正式參數mas已經是指針的地址,因此調用是

*mas=(int*)realloc(*mas,((*ind))*sizeof(int)); 
(*mas)[num-1]++; 

由於realloc的句柄,並返回副本的指針,不作爲參考。

您正在將存儲位置(NULL)的地址存儲到您的ProcessBit函數的存儲器位置的地址,然後將該位置的地址傳遞給realloc函數。該函數試圖在棧上重新分配存儲變量mac的內存。難怪這是一個無效的指針。

通過傳遞&mac你只是在取消引用指針的同時在錯誤的方向上邁出了一步。

相關問題