簡體   English   中英

在C中對大型數組使用realloc的分段錯誤

[英]Segmentation fault using realloc on large arrays in C

我正在嘗試實現一個動態數組-如果數組已滿,並且您添加另一點,它將使數組的大小增加一倍。 數組的大小由len表示,數組中剩余的空間由reserved表示。 如果我附加5650點,則效果很好,但一旦達到5700或更高,它就會給我帶來細分錯誤。 關於什么可能導致此的任何想法?

int point_array_append( point_array_t* pa, point_t* p )
{
    if(pa->reserved==0)
    {
        if(!(realloc(pa->points, sizeof(point_t)*(pa->len * 2))))
            return 1;
        pa->reserved=pa->len;
    }
    pa->len++;
    pa->reserved--;
    pa->points[(pa->len)-1] = *p;
    return 0;
}

realloc返回一個指向新內存的指針。 你不能只是那樣扔掉。

realloc將調整數組的大小(如果可以),然后將返回指向數據新地址的指針。 如果失敗,它將返回一個空指針,您應該檢查該指針(這樣做了,很高興看到!)。 另外需要注意的是非常重要realloc可以存儲移動到不同的位置,如果它需要。 在此代碼中,如果發生這種移動,您將遇到麻煩,因為您僅跟蹤數據的原始指針在哪里。 因此,如果realloc將數據移動到其他地方,而您不應該將其寫入其他地方,這是未定義的行為,這可能會導致您看到的段錯誤。 機會是,直到5650點沒有決定是由做realloc ,但更重要的是量引發了移動到不同的指針。

解決方法是使用realloc返回的指針,並確保在執行任何操作之前先檢查該指針是否為null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM