2017-04-05 118 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你只是在取消引用指针的同时在错误的方向上迈出了一步。

相关问题