在C中对大型数组使用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;
}
梭子87

realloc将调整数组的大小(如果可以),然后将指针返回到数据的新地址。如果失败,它将返回一个空指针,您应该检查该指针(这样做了,很高兴看到它!)。此外,重要的是要注意,realloc可以根据需要将内存移动到其他位置。在此代码中,如果发生这种移动,您将遇到麻烦,因为您仅跟踪数据的原始指针在哪里。因此,如果realloc将数据移动到其他地方,则不应该将其写入其他地方,这是未定义的行为,这可能会导致您看到的段错误。很有可能直到5650点之前都没有做任何动作,realloc但是超过该数量会触发移动到另一个指针。

解决方法是使用由返回的指针,realloc并确保在执行任何操作之前先检查该指针是否不为null。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章