为什么我的简单代码不适用于C ++?

时间:2017-04-05 07:31:24

标签: c++

函数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

}

2 个答案:

答案 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,您只需在取消引用指针时向错误的方向迈出一步。