我正在尝试实现一个动态数组-如果数组已满,并且您添加另一点,它将使数组的大小增加一倍。数组的大小由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将数据移动到其他地方,则不应该将其写入其他地方,这是未定义的行为,这可能会导致您看到的段错误。很有可能直到5650点之前都没有做任何动作,realloc
但是超过该数量会触发移动到另一个指针。
解决方法是使用由返回的指针,realloc
并确保在执行任何操作之前先检查该指针是否不为null。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句