函数realloc()出错:指针无效
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 :(得分:3)
一些问题:
realloc
的第一个参数是原始指针(或NULL
)。
您的ProcessBit
无法正确模拟传递引用。
您可以使用否定索引。
mas
是指向int
指针的指针,但您将其用作指向int
的指针。
A"固定"版本可能看起来像这样:
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
代替,这将通过更简单的代码解决几乎所有问题。
答案 1 :(得分: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
,您只需在取消引用指针时向错误的方向迈出一步。