繁体   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