解决一个千万级别的数组引发的问题的深入剖析

linux环境编程相关 专栏收录该内容
10 篇文章 0 订阅

问题:

         要产生一千万个7位的随机数。定义一个千万int元素的数组。

#define N10000000

         intmain()

         {

         int a[N] = {0};

}

        

         这时候程序可以编译通过,但是一运行就会出现segment fault。

 

问题的分析:

         既然程序能编译通过,不是compile-time之类的错误,肯定是run-time类的错误,而run-time错误,肯定是和堆栈的问题相关。由于数组很大,而且数组是静态的,初步猜想是栈溢出的原因。

 

问题的解决:

         将数组的定义改为

int main()

         {

         static int a[N] = {0};

}

         程序可以运行了。

 

问题的深入思考:

         为什么这样定义数组不行呢,为什么会栈溢出呢。

1.      首先看看linux程序的进程内存结构

        

我们对比一下前后两种定义方式的程序各个区的大小用命令size 可执行程序名

第一种方式定义:

 

这时候数据肯定归为栈区,各个数据块都不大。

 

第二种方式定义:

 

这时候数据在bss静态未初始化区。

 

由上面的各个区的分析我们可以知道,刚开始我们在main函数中定义的数组属于非静态的局部变量,是放在栈区的,可是为什么会溢出呢,linux规定的栈区大小是多少?

在linux上查看栈区的大小运行命令:ulimit –s


我们定义的数组大小接近40M,而栈区大小最大是10M肯定就会溢出了。

 

问题的最后:

         总而言之,要定义很大的数组,不能放在栈区。可以声明为局部的静态数组,或全局数组。或者你可以修改linux规定的栈区的上限。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

BlueLoveyyt

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值