Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么大型静态阵列会出现seg故障,而动态阵列不会';T(C+;+;)_C++_Arrays_Dynamic_Static - Fatal编程技术网

C++ 为什么大型静态阵列会出现seg故障,而动态阵列不会';T(C+;+;)

C++ 为什么大型静态阵列会出现seg故障,而动态阵列不会';T(C+;+;),c++,arrays,dynamic,static,C++,Arrays,Dynamic,Static,以下代码给出了一个分段错误: bool primeNums[100000000]; // index corresponds to number, t = prime, f = not prime for (int i = 0; i < 100000000; ++i) { primeNums[i] = false; } 我没有seg故障。我大致了解了原因:在第一个示例中,内存放在堆栈上,而在动态情况下,内存放在堆上 你能详细解释一下吗 bool primeNums[100000

以下代码给出了一个分段错误:

bool primeNums[100000000]; // index corresponds to number, t = prime, f = not prime

for (int i = 0; i < 100000000; ++i)
{
    primeNums[i] = false;
}
我没有seg故障。我大致了解了原因:在第一个示例中,内存放在堆栈上,而在动态情况下,内存放在堆上

你能详细解释一下吗

bool primeNums[100000000];
耗尽了所有的
堆栈
空间,因此,由于没有足够的堆栈空间来分配一个具有巨大大小的静态数组,您将出现分段错误

动态数组分配在
堆上
,因此,不太容易出现分段错误。在C++中使用<代码> new < /C> >创建动态数组,调用“代码>操作符new <代码>分配内存,然后调用构造函数初始化分配的内存。 下面的标准[new.delete.single]中引用了有关新操作员的工作方式的更多信息:

所需行为:

将非空指针返回到适当对齐的存储器(3.7.3),或否则抛出错误的\u alloc异常。此要求对该功能的替换版本具有约束力

默认行为:

-执行循环:在循环中,函数首先尝试分配请求的存储。该尝试是否涉及对标准C库函数malloc的调用尚不确定

-如果尝试成功,则返回指向已分配存储的指针。否则,如果set_new_handler()的最后一个参数是空指针,则抛出bad_alloc

-否则,该函数将调用当前的新_处理程序(18.4.2.2)。如果调用的函数返回,循环将重复

-当分配请求的存储的尝试成功或被调用的new_handler函数未返回时,循环终止


因此,将动态数组与
new
一起使用,当没有足够的空间时,默认情况下会抛出
bad_alloc
,在这种情况下,当数组大小很大时,您会看到异常而不是分段错误,最好使用动态数组或向量等标准容器。

某些编译器或操作系统限制堆栈的大小。在windows上,默认值为1 MB,但可以更改。

在第一种情况下,您可以在堆栈上分配内存:

bool primeNums[100000000]; // put 100000000 bools on stack

for (int i = 0; i < 100000000; ++i)
{
    primeNums[i] = false;
}
由于堆栈(非常)有限,这就是segfault的原因

bool primeNums[100000000];
此声明在中分配内存。堆栈空间是启动应用程序时分配的内存块。它通常在几千字节或兆字节的范围内(取决于语言实现、编译器、操作系统和其他因素)

这个空间是用来存储本地和静态变量的,所以你必须保持温和,不要过度使用它。因为这是一个堆栈,所以所有分配都是连续的(分配之间没有空格)


在这种情况下,分配的内存是堆。这是一个没有空间的地方,可以分配大量新的内存。

您已经指出了很大一部分原因。另一部分是,在一个典型的情况下,堆栈大小是相对有限的——大约几兆字节。堆(本质上)是盒子中所有的空闲RAM。“堆栈”只是系统留出的一小部分,用来保存正在进行的函数调用列表和每个函数的几个局部变量。调用函数时,从中调用的函数和局部变量将添加到堆栈上的列表中。当函数返回其局部变量和从中调用的位置时,将从列表中删除(返回后)。对于系统来说,期望一个程序进行一百万次嵌套函数调用或有一百万个局部变量或它们的一些组合是不合理的。@John感谢您的解释。静态数组不会分配到堆栈上,除非OP通过
static
表示其他意思
bool *primeNums = new bool[100000000]; // put 100000000 bools in the heap
bool primeNums[100000000];
bool *primeNums = new bool[100000000];