【问题标题】:Segmentation fault using realloc on large arrays in C在 C 中的大型数组上使用 realloc 的分段错误
【发布时间】:2015-01-21 13:08:10
【问题描述】:

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

【问题讨论】:

  • sizeof(point_t) 等于什么?

标签: c++ c arrays realloc


【解决方案1】:

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

解决方法是使用realloc 返回的指针,并确保在对它进行任何操作之前检查该指针不为空。

【讨论】:

  • 我知道我不应该按照规则发表感谢,但我无法抗拒 - 谢谢!这个解释非常清楚 - 我非常感谢它失败的原因以及如何正确实施它的解释。
【解决方案2】:

realloc 返回一个指向新内存的指针。你不能就这样扔掉它。

【讨论】:

  • 相关:它可能会失败,在这种情况下,您仍然对传递的指针负责。
  • 您能详细说明一下吗?我认为我在那里使用 realloc 的方式会将 pa->points 的大小增加 100%,然后如果失败,我会返回 1。
  • Realloc 通常不会修改您现有的数组。它分配一个新数组,将现有数组复制到新数组,并返回指向新数组的指针。您应该将pa->points 设置为realloc 的返回值。
猜你喜欢
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2013-02-23
相关资源
最近更新 更多