段错误

   前面对于这个问题隐约知道一些,访问了不存在的内存,如典型的数组的越界问题,int s[4];其实只能访问到s[3]的,所以越界的话编译能通过但是,运行的时候回发生段错误。

  同时我觉得所有的自变量一开始一定要设置一个初始值,我曾经就是因为一个小的变量i没有赋值,导致一个程序检查了2h之久。对于指针的运用则需要更加的小心,各种野指针是常常造成错误的小坏蛋,而且很难检查出来,所以最好就是用完之后,赋值NULL,就像给一条野狗拴住了绳子一样。这一类问题在陈正冲老师的《c语言的深度剖析》中讲述的非常的精彩。本人是机缘巧合之下看的,觉得受益无穷,比起c trip,c专家编程一类的c语言的经典读物来说,这本书反而对我的 帮助更大。

  以上两点其实大部分有好的编程习惯的基本上都还行。但是今天在做PAT的一道题目的时候,一个小小的问题,导致我一直出现段错误,而且在此盘旋很久,所以特此分享给大家,希望对于遇上同类问题的朋友有所帮助。

首先我需要一个非常大的数组 int Rank[10000000][4]={0} ;因为第一个字段要存储的是一个学生编号,典型的以空间换时间的方法。但是始终出现段错误,我以为是内存不够,但是事实上我的内存运用远小于题目所规定的64MB,大概在400多KB左右。后来经过很复杂的检查,发现这个大的数组应该设置成全局变量,而不是在main函数里面的局部变量。

  编译器分配内存的时候,分为静态存储区,堆和栈,其中静态存储区不在多说主要是针对static的静态变量。而函数,局部变量都是在堆中分配,而且这个堆是很小的,都是一个函数调用完之后就销毁的,main函数虽然是特殊的函数,但是他的分配还是咋堆上而不是在栈上。而栈是个更大的存储空间,用于全局变量,所以这种大型的内存分配一定要注意分配的地方。当然肯定不是都分配到全局变量去就好了,因为全局变量是一直存在的,非常耗内存,必须知道什么时候是全局的,什么时候是局部的。本题其实就逻辑来说,当然在哪里都可以,但是考虑到内存问题就必须在段上分配。

   当然因为scanf()函数字符数组以外的变量没有加&也会导致段错误的!

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值