为了账号安全,请及时绑定邮箱和手机立即绑定

大数组大小的故障分割

大数组大小的故障分割

C++ C
HUH函数 2019-05-30 16:29:57
大数组大小的故障分割下面的代码在2GB机器上运行时给了我一个分段错误,但在4GB机器上工作。int main(){    int c[1000000];    cout << "done\n";    return 0;}数组的大小只有4MB。在c+中可以使用的数组的大小是否有限制?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

在C或C+中,通常在堆栈上分配本地对象。在堆栈上分配一个大数组,超出堆栈所能处理的范围,因此您将获得一个StackOverflow

不要在堆栈上本地分配它,而是使用其他地方。这可以通过以下两种方法来实现:全球或者将其分配到全局。如果不使用任何其他编译单元,则可以使用全局变量。为了确保这不是偶然发生的,添加一个静态存储说明符,否则只需使用堆。

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

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

这将在数据段中分配,数据段也是堆的一部分:

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

这将在堆中某个未指定的位置分配:

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


查看完整回答
反对 回复 2019-05-30
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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

ulimit -s unlimited

但是要小心,记忆是一种有限的资源,强大的力量带来了巨大的责任:)


查看完整回答
反对 回复 2019-05-30
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

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

如果您在堆上分配数组,假设您的机器有足够的内存,您应该没事。

int* array = new int[1000000];

但要记住这需要你delete[]数组。更好的解决办法是使用std::vector<int>并将其调整为1000000元素。


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信