解决一个千万级别的数组引发的问题的深入剖析
来源:互联网 发布:js判断滚动条位置 编辑:程序博客网 时间:2024/06/08 10:01
问题:
要产生一千万个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规定的栈区的上限。
- 解决一个千万级别的数组引发的问题的深入剖析
- 千万级别的数据存储
- 解决一个文件名显示过长的问题,引发的思考~
- 头文件互相包含所引发的的问题(深入剖析)
- 解决singleinstance引发的问题
- Python笔记:一个二维数组引发的问题
- 一个问题引发的思考
- 一个问题引发的笑话
- 一个引用 引发的问题
- 一个问题引发的思考
- 一个空格引发的问题
- 一个printf引发的问题
- 一个索引引发的问题
- 一个由数组越界引发的。。。
- 怎样玩转千万级别的数据
- 怎样玩转千万级别的数据
- 玩转千万级别的数据(一)
- 怎样玩转千万级别的数据
- Cisco设备基础知识
- Cisco硬件与连接方式基础
- JBOSS EAP 6 系列六 公共模块的jar配置到jboss的modules详细配置
- Markdown如何满足中文阅读习惯实现首行缩进
- PHP中内存溢出的问题
- 解决一个千万级别的数组引发的问题的深入剖析
- 黑马程序员——集合框架详解
- MERGE-SORT: INTRODUCTION TO ALGORITHMS
- HDU ACM 4494 Teamwork 最小费用最大流
- 小结1
- BinTree::定义
- 小红帽免费酒店管理系统PMS
- 2015摩根士丹利(Morgan Stanley)实习电话面试
- 一个WordPress站点绑定多个域名