【问题标题】:C - using realloc on pointer to pointer result in segmentation faultC - 在指向指针的指针上使用 realloc 会导致分段错误
【发布时间】:2018-01-23 12:07:55
【问题描述】:

我正在尝试使用 realloc,因为我想提高代码的速度。当满足某个条件时,我想将一个 void 双指针重新分配到更大的大小,但我遇到了分段错误。这是代码。

if (p_bheap->currentSize == p_bheap->arraySize){
    p_bheap->arraySize = p_bheap->arraySize*2 + 1;
    p_bheap->pp_array = realloc(p_bheap->pp_array, p_bheap->arraySize);
}

然而,这会导致分段错误。但是,如果我制作自己的重新分配功能,它就可以工作。

if (p_bheap->currentSize == p_bheap->arraySize){
    p_bheap->pp_array = bheap_reallocate(p_bheap);
}

void** bheap_reallocate(bheap* p_bheap){
    p_bheap->arraySize = p_bheap->arraySize*2 + 1;
    void** pp_newArray = malloc(p_bheap->arraySize*sizeof(void*));
    for (int i = 0; i < p_bheap->currentSize; i++){
        pp_newArray[i] = p_bheap->pp_array[i];
    }
    free(p_bheap->pp_array);
    return pp_newArray;
}

是否有任何可以发现但我没有看到的明显错误?对于那些想知道我正在编写二进制堆的人。

【问题讨论】:

  • 传递给realloc的大小就像传递给malloc的大小:字节的大小(不是元素)。
  • 顺便说一句,永远不要将realloc 的结果分配回作为参数传递的指针。如果realloc 失败,它将返回NULL,您将丢失原始指针并发生内存泄漏。
  • 天哪,谢谢。我忘了乘法。
  • 而且,顺便说一句,p = malloc(count * sizeof *p); 样式会避免这种问题(realloc 类似)
  • 在某些情况下,即使在内存不足的情况下也可以继续。必须根据具体情况决定。

标签: c pointers memory realloc


【解决方案1】:

如果您有一个先前分配的对象,比如str,并且想要将其内存调整为另一个大小,请使用临时变量以防止在realloc 失败时丢失内存。插图:

char *str = calloc(20, 1);
if(str) // should always check return of calls to [c][m][re]alloc.
{ // at this point, str owns 20 bytes of memory.  If you use str in a subsequent
  // call to realloc, and the call fails, then the memory previously allocated in 
  // the original call to calloc() will be lost.  (memory leak).
....
char *tmp = {0};//So instead, use a temporary variable to accept memory
                //and provide a way to recover if allocation fails

tmp = realloc(str, 40);//newsize (40) in bytes
if(!tmp) //test reallocation
{
    //reallocation failed.
    //free previously allocated memory, and decide how to proceed.
    //In this case, return a NULL, and let the calling function decide.
    free(str);//if allocation fails, free the previous object and leave
    return NULL;
}
//reallocation succeeded.  Proceed normally
str = tmp;//reallocation succeeded, assign its address to str and proceed normally

【讨论】:

    【解决方案2】:

    您不能使用相同的内存空间来接收结果。尝试使用临时数组或分配其他空间。

    【讨论】:

    • 这是 a 问题,但不是 OP 的 问题。
    猜你喜欢
    • 2021-05-25
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多