【问题标题】:Segmentation fault in C (overflow?) [duplicate]C中的分段错误(溢出?)[重复]
【发布时间】:2016-12-13 16:34:06
【问题描述】:

这是我发生的部分代码和分段错误:

int main (int argc, char *argv[]) {
  printf ("====================================================\n");
  double pointArray[MAX_NUM_OF_POINTS][DIMENSION];
  double range;
  int num_of_nearest;
  double queryPoint[DIMENSION];
  int counter;
  int dist;
  int num;
  printf ("====================================================\n");
}

MAX_NUM_OF_POINTS 定义为 100,000,000。

但是,当我将此数字更改为更小(例如 100,000)时,分段错误消失了。

谁能告诉我原因?

【问题讨论】:

  • 如果没有看到程序的其余部分,很难回答。能否使用断点或打印语句来查看分段错误的确切发生位置?
  • 您可能用完了堆栈空间...这似乎相关:stackoverflow.com/questions/2780100/…
  • pointArray 对于 每个 维度是 800'000'000 字节,几乎是 800MB,而 Windows 上的默认堆栈大小仅为 1MB,Linux 上为 4/8MB。如果 DIMENSION 为 3,那么您的阵列面积约为 2.4GB

标签: c segmentation-fault


【解决方案1】:

局部变量是在堆栈上创建的,堆栈空间有限。通过尝试创建一个至少包含 100000000 个双精度数的数组,每个双精度数可能是 8 个字节,它对于堆栈来说太大并导致一个段错误。

如果将数组声明为全局数组,则它不会驻留在堆栈中,而是驻留在数据段中,这样可以处理更大的变量。或者,您可以使用 malloc 动态创建数组,在这种情况下它位于堆栈中。

然而,这引发了一个问题,即为什么需要这么大的数组。您可能需要重新考虑您的设计,看看是否有一种内存效率更高的方式来做您想做的事情。

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2016-03-30
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多