为什么我的简单代码在C++中不起作用?

Why don't my simple code work in C++?

本文关键字:不起作用 C++ 我的 简单 代码 为什么      更新时间:2023-10-16

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

几个问题:

  • 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您只是在取消引用指针时朝着错误的方向迈出了一步。