为什么我的简单代码不能在C++中工作?
问题描述:
错误功能的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
}
答
的几个问题:
的第一个参数
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
相反,它会用简单得多的代码来解决几乎所有的问题。
答
参数错误。既然你试图重新分配一个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
你只是在取消引用指针的同时在错误的方向上迈出了一步。
另外,这段代码不在C++中,它在C中。 –