【问题标题】:Explanation of why allocating a large array results in segmentation fault in C [duplicate]解释为什么在 C 中分配大数组会导致分段错误 [重复]
【发布时间】:2015-09-01 01:57:14
【问题描述】:

我对 C 语言不太熟悉,但我最近一直在用该语言编写一些程序来加快它的速度(它最初是用 python 编写的)。我真的没有问题了,因为我已经设法解决了我原来的问题。不过,我想知道为什么这个解决方案有效。

我有一个表示复数的数据结构,定义为

typedef struct _fcomplex { float re, im; } fcomplex;

然后我想创建一个复数数组:

fcomplex M[N];

这里的 N 是一个很大的数(大约是 ~10^6)。然后我在一个函数中用零初始化数组,该函数基本上遍历所有索引并设置数组中的值。是这样的:

fcomplex num = {0.0, 0.0};
int i;
for (i=0 ; i < N ; i++) {
   M[i] = num;
}

但是,当我运行代码时,会导致分段错误。但是,如果我使用 malloc() 为数组分配空间而不是

fcomplex* M = malloc(N*sizeof(fcomplex));

然后像以前一样做所有事情,代码工作正常。此外,对于较小的 N 值,无论哪种方式,代码都能正常运行。

正如我所说,使用 malloc() 已经解决了问题,但我想知道为什么?

【问题讨论】:

  • 因为堆栈在内存中是有限的(假设您在函数中声明了大数组)并且声明大数组会导致堆栈溢出。当您使用malloc 动态分配内存时,数组分配在比堆栈大得多的堆上。
  • 对于大型数组,最好使用操作系统内存分配函数。

标签: c arrays memory-management


【解决方案1】:

这取决于您分配数组的位置。如果它在函数内部,则变量分配在堆栈上,默认情况下(我假设您正在运行 linux)堆栈大小为 8Mb。

您可以使用ulimit -s 找到它,也可以修改此值,例如ulimit -s 1000000

您可能想看看这些问题:

【讨论】:

  • 在我的 Linux 机器上,堆栈限制一般是 800 万字节,而不是 8 KB。
  • 你说得对,我的意思是 8192 但手册页上说该单位实际上是 1024 字节。我已更正以更准确。
  • 我在 main() 函数中分配数组,然后将指向数组的指针作为参数传递给函数。不过,谢谢。
猜你喜欢
  • 2016-09-24
  • 2016-10-31
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多