使用C中的大型数组上的realloc进行分段错误

时间:2014-11-23 21:12:31

标签: c++ c arrays realloc

我正在尝试实现动态数组 - 如果数组已满并且您添加了另一个点,它将使数组的大小加倍。数组的大小用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;
}

2 个答案:

答案 0 :(得分:7)

realloc返回指向新内存的指针。你不能只是那样扔掉它。

答案 1 :(得分:3)

realloc将调整数组的大小(如果可以),然后它将返回指向数据新地址的指针。如果它失败了它会返回一个空指针,你应该检查一下(你做了哪个,这很好看!)。此外,请务必注意realloc如果需要,可以将内存移动到其他位置。在此代码中,如果发生此类移动,您将遇到麻烦,因为您只跟踪原始数据指针的位置。因此,如果realloc将数据移动到其他地方你将写入某个地方你不应该是哪个是未定义的行为,这可能会导致你看到的段错误。有可能直至5650点realloc没有进行任何移动,但超过该数量触发了向不同指针的移动。

修复是使用realloc返回的指针,并确保在对它执行任何操作之前检查此指针是否为空。