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

c语言中分配一个很大的数组,运行时段错误

c语言中分配一个很大的数组,运行时段错误

狐的传说 2019-04-19 15:58:59
intmain(intargc,charconst*argv[]){intj;inta[100000000];for(j=0;j
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这个问题101了。这么大的数组炸栈是肯定的。
栈内存一般而言由系统的约束和配置决定,一般来说默认的在1-8M每进程不等。linux和macosx一般可以用ulimit命令调节,但一般仍会受到操作系统的“硬限制”而不能想调多大调多大。
关于系统栈:
系统栈的目的,在于跟踪和追溯函数调用的历史。
这里的函数尤其指每个函数都有功能上的意义,即打印出系统栈就能表示出程序有意义的功能分块。
使用栈内存做算法,不是不好,不过和系统栈的惯例用法毕竟稍微有一点偏差。
层级很深,但每个层级都很类似(单独提取出来,无甚分析价值)的深层搜索,无论是为了防止炸栈,还是为了保持调用栈的简洁可分析,都应当自己建立用户栈。
关于栈内存:
栈内存整批进、整批退,不存在碎片和管理问题,性能优于堆内存。
但相应的代价就是:
其一,比较少,寸土寸金;
其二,函数结束(退栈)之后,栈顶退回函数执行前的位置,则函数中所有局部变量所在的栈内存落在栈外自然销毁。(重要)
因此函数内的局部变量,只应当表示函数内部执行到了什么状态,绝对不能用作实质性的数据区域。
例如:应当用局部变量表示缓冲区的下标、指针,但缓冲区本身绝对不应该开在栈上。
数据区域要么从堆上分配获得指针,要么通过参数传递得到指针。
事实上这里用全局变量也不是唯一的选择(至少全局变量在语义上还是不太好看)。也可以使用malloc()来做,获取按需分配内存的灵活性,不必事前规定一个“足够大的范围”:
intn,i;
int*a,*p;
scanf("%d",&n);
a=malloc(sizeof(int)*n);
p=a;
for(i=0;i{
scanf("%d",p++);
}
题外话——“局部变量所在的栈内存区域自然销毁”这件事,坑死多少C程序员。这里不详细展开,但请一定小心不要撞这个常识性的错误,即:不要把任何局部变量的地址用return返回给调用者。
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号