【问题标题】:How can I reallocate array which allocated in another function?如何重新分配在另一个函数中分配的数组?
【发布时间】:2017-11-21 05:46:35
【问题描述】:

我是 C 编程新手。 我想做一个链表,所以我做了,但它不起作用。 在我这样做之后,我做了一个测试,但它仍然给出了一个错误。

malloc:对象 0xa000000000000000 的错误:未分配重新分配的指针
在 malloc_error_break 中设置断点进行调试

如何重新分配这个数组?

void Allocate(int **arr,int totalNum, int subNum)
{
    for(int n=0;n<(totalNum+1);n++)
    {
        arr[n] = (int*)realloc(arr[n],(size_t)((subNum+1)*sizeof(int)));
    }
}
int main()
{
    int totalNum = 20;
    int subNum = 5;
    int **arr;
    arr = (int**)malloc((totalNum+1)*sizeof(int*));
    Allocate(arr,totalNum, subNum);

    for(int n=1;n<(totalNum+1);n++)
    {
        for(int s=1;s<(subNum+1);s++)
        {
            arr[n][s] = rand()%5;
            cout<<"arr["<<n<<"]["<<s<<"]: "<<arr[n][s]<<endl;
        }
    }
}

【问题讨论】:

  • 我无法理解这个问题。如果您不知道,链表和数组是不同的东西
  • 我是 C 编程新手。 -- 你为什么把它标记为C++? C++ 有std::list,如果你想要一个双向链表,std::forward_list 用于单链表,std::vector 用于动态错误。因此没有必要像这样编码。
  • C 不是 C++,请使标签和问题正文匹配。永远不要在 C++ 中使用 malloc 或 realloc 或数组或原始指针。

标签: c++ arrays linked-list realloc


【解决方案1】:

程序崩溃是因为在调用realloc()arr[n] 未初始化。

我不完全理解您为什么要在 Allocate() 函数中使用 realloc() 而不是 malloc()。但无论如何,让我们假设realloc() 是您所需要的。

最简单的解决方法是初始化 arr 内容。

arr = (int**)calloc((totalNum+1),sizeof(int*));

【讨论】:

    【解决方案2】:

    realloc() 的第一个参数必须是 NULL 或之前由 malloc()realloc() 返回的指针。您将一个充满未初始化数据的数组传递给Allocate(),因此您将未初始化的指针传递给realloc()。您需要先将它们全部初始化为NULL

    arr = malloc((totalNum+1)*sizeof(int*));
    for (int i = 0; i < totalNum+1; i++) {
        arr[i] = NULL;
    }
    Allocate(arr,totalNum, subNum);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 2016-06-19
      • 1970-01-01
      • 2021-07-15
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多