gpt4 book ai didi

c - 解释为什么在 C 中分配大数组会导致段错误

转载 作者:行者123 更新时间:2023-11-30 20:01:33 24 4
gpt4 key购买 nike

我对 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() 已经解决了问题,但我想知道为什么?

最佳答案

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

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

您可能想看看这些问题:

关于c - 解释为什么在 C 中分配大数组会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30864358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com