C++ 大尺寸阵列上的分段错误

C++ 大尺寸阵列上的分段错误,c++,arrays,segmentation-fault,C++,Arrays,Segmentation Fault,当在2Gb机器上运行时,下面的代码给出了一个分段错误,但在4GB机器上工作 int main() { int c[1000000]; cout << "done\n"; return 0; } intmain() { 国际货币基金组织[1000000]; cout这里可能只是堆栈溢出。数组太大,无法放入程序的堆栈地址空间 如果您在堆上分配数组,那么假设您的机器有足够的内存,您应该可以 int*array=newint[1000000]; 但请记住,这将要求您删除[

当在2Gb机器上运行时,下面的代码给出了一个分段错误,但在4GB机器上工作

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}
intmain()
{
国际货币基金组织[1000000];

cout这里可能只是堆栈溢出。数组太大,无法放入程序的堆栈地址空间

如果您在堆上分配数组,那么假设您的机器有足够的内存,您应该可以

int*array=newint[1000000];


但请记住,这将要求您
删除[]数组。更好的解决方案是使用<代码>:ST::vector < /C> >将其调整为1000000个元素。

在堆栈上分配您的数组。在这种情况下,尝试使用AlLoc分配相同大小的数组。

C或C++本地对象通常分配给堆栈。超出堆栈所能处理的范围,因此您将获得

不要在堆栈上本地分配它,而是使用其他位置。这可以通过使对象成为全局对象或在全局堆上分配它来实现。如果不使用来自任何其他编译单元的,则全局变量是可以的。为确保这不会意外发生,请添加静态存储说明符,否则只使用堆

这将在BSS段中分配,BSS段是堆的一部分:

static int c[1000000];
int main()
{
   cout << "done\n";
   return 0;
}
int main()
{
   int* c = new int[1000000];
   cout << "done\n";
   return 0;
}
static int c[1000000];
int main()
{

cout因为您将数组存储在堆栈中。您应该将其存储在堆中。请参阅以了解堆和堆栈的概念。

此外,如果您在大多数UNIX和Linux系统中运行,则可以通过以下命令临时增加堆栈大小:

ulimit -s unlimited

但要小心,内存是一种有限的资源,巨大的能力带来了巨大的责任:)

您的普通数组是在堆栈中分配的,而堆栈仅限于几个magabytes,因此您的程序会出现堆栈溢出和崩溃

最好是使用基于堆分配的数组,它可以增长到几乎整个内存的大小,而不是普通数组

在上面的示例中,您得到的行为几乎与分配普通数组
intc[100][456][123];
(除了向量在堆上而不是堆栈上分配外),您可以作为
c[10][20][30]访问元素一样
与普通数组中的相同。上面的示例也在堆上分配数组,这意味着您可以将数组大小分配到整个内存大小,而不受堆栈大小的限制


要获取指向向量中第一个元素的指针,请使用
&c[0]
或仅使用
c.data()

谢谢你的回答,但是你能解释一下为什么数组分配在堆栈上,为什么不在主程序内存中。给定的代码分配在堆栈上,因为它在编译时被指定为一个元素数恒定的数组。值只与malloc、new等一起放在堆上。所有自动变量都是alloca的ted在堆栈上。如果您查看Disassable,您将看到从堆栈指针中减去的局部变量的大小。当您调用malloc或calloc或任何内存函数时,这些函数会找到足够大的内存块来满足您的请求。@Charles为什么我们可以从堆而不是从堆栈分配更多内存?我的据了解,堆栈和堆在内存中分配的地址空间中都朝相反的方向移动。@saurabhagarwal堆不移动。它甚至不是一个连续的内存区域。如果使用第三种模式(在堆上分配),分配器只返回一个适合您大小要求的可用内存块,请不要忘记删除[]在某个阶段删除指针,否则会泄漏内存。或者查看智能指针。@meowsquak当然,最好在使用
new
分配的任何地方
delete
。但是如果您确定只分配一次内存(如在main中)这是严格不需要的-即使没有显式的
delete
'at'drhirsch(你怎么做at字符?),内存也保证在main的出口处被释放-是的,公正的评论。由于OP对语言来说是新的,我只是想确保他们和其他看到您的好答案的人都知道第三个选项的含义(如果普遍使用)。这是解决方案,但我建议所有人在删除程序堆栈大小的默认限制时都要非常谨慎。您将体验原因不仅是性能严重下降,而且您的系统可能会崩溃。例如,我试图在一台4GB RAM的机器上使用快速排序对一个包含1600000个整数元素的数组进行排序,结果我的系统几乎死机。LOL@rbaleksandar我认为您的~16MB程序几乎杀死了您的计算机,因为您使用的是阵列的多个副本(每个函数调用可能有一个函数?)请尝试更具内存意识的实现;)我很确定数组处理是可以的,因为我是通过引用而不是通过值传递的。bubblesort也会发生同样的事情。见鬼,即使我的快速排序实现很糟糕,但bubblesort也不可能实现得不正确。哈哈,你可以试试基数排序,或者简单地使用std::sort:)不可能。这是一个实验室作业D
ulimit -s unlimited
#include <vector>
#include <iostream>

int main() {
   std::vector<int> c(1000000);
   std::cout << "done\n";
   return 0;
}
#include <vector>
#include <array>
#include <iostream>

int main() {
   std::vector<std::array<std::array<int, 123>, 456>> c(100);
   std::cout << "done\n";
   return 0;
}