| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1823 人关注过本帖
标题:关于数组超界问题
只看楼主 加入收藏
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:0 
9L正解,临时变量内存分配问题。

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-08-12 20:11
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
以下是引用liufashuai在2013-8-12 19:22:09的发言:

就是临时变量在栈上分配,而且栈的分配地址是从下到上的!




临时变量在栈上分配是什么意思????都是哪种变量是在栈上分配的???哪些是在堆上分配的??????

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-12 20:13
aa547880610
Rank: 2
等 级:论坛游民
帖 子:8
专家分:14
注 册:2013-7-29
收藏
得分:2 
你数组越界赋值了,a[10]应该是0到9,你最后一次循环是a[10]=0,而a[10]是i的内存地址,所以你的最后一次循环是把0赋值给i了,然后判断i<=10,此时i=0,所以就是个死循环了,
对于像这种内存越界的问题 你学一下汇编了解变量 常量在虚拟内存中的内存地址就很容易搞懂了,而且越界的后果是千奇百怪的,研究这些问题没什么意义,按lz你初学的水平应该先按书本来,不要越界,以后学深了 对于这些底层东西你会越来越理解。
分给我吧.
2013-08-12 22:05
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
收藏
得分:0 
回复 9楼 liufashuai
受教了

前几天有人问利用栈溢出入侵,  这就是原理呀,  如果我给之后指向一个蠕虫病毒的函数指针,  会发生什么情况!!

否极泰来
2013-08-12 23:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
想过为什么新版的编译器不出现这种情况?还原理了?

授人以渔,不授人以鱼。
2013-08-12 23:14
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
收藏
得分:0 
请教版主解释!!!!!

否极泰来
2013-08-12 23:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
确保代码不越界才是正路。越界之后出现的现象,你找到相应的解释,又能利用它来干什么?难道想利用这种副作用?何况副作用总是会被消除的,效应并不确定,刻意利用这些东西,是邪门歪道。学IT到这份上,唉~

授人以渔,不授人以鱼。
2013-08-12 23:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:11 
在栈上的变量,必然是连续分配的,再加上向上或向下增长,这只是一种实现假定,尽管某些编译器确实是这样做的,但并不是所有编译器都会这样做,因为标准也没规定编译器必须这样分配变量,那是编译器的自由,编译器可能会察觉这样的漏洞,采取预防措施,那些措施未必是我们所知道的(比如跳过一些间隙分配,踏入间隙读写即触发系统保护机制,谁知道编译器设计者会怎么做),也不需要知道,只要规规矩矩地写出不越界的代码即可,越界之后有什么现象,与你无关,研究它不见得你是高手。

程序员最忌的就是假定太多,假定这假定那,一到现实不满足那么多假定,这程序就越容易崩溃和不切实用。假定调用者不出错就是一个隐患很大的假定,现实中指望别人不出错,把正确的东西交给你处理,那也太容易做人了。这种思维不纠正,苦头有得你吃。任何程序的编写都有这样那样的假定,但自己必须很清醒地知道到底作了哪些假定,并充分论证过这些假定是无害和适用的,才能在这些假定的基础上写程序,一旦忘记了这些假定前提,写出来的程序就会有千奇百怪的运行时问题,那才是程序员最头痛的东西,程序员一辈子都在跟这些错误打交道,一个不给自己的产品包终身的厂家,如何在市场上立足,真以为程序员很风光么,那样的生涯闷死你。

这个其实也正犯了编程规范中不要给内存照X光片的戒条,试图解析内存的细节,殊不知不全然是那样的,个别适用的模型并不普遍,那样的经验有什么用呢。

[ 本帖最后由 TonyDeng 于 2013-8-13 00:51 编辑 ]

授人以渔,不授人以鱼。
2013-08-13 00:33
小武哥253
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2013-7-27
收藏
得分:0 
越界了
2013-08-13 00:36
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
以下是引用TonyDeng在2013-8-12 23:58:13的发言:

确保代码不越界才是正路。越界之后出现的现象,你找到相应的解释,又能利用它来干什么?难道想利用这种副作用?何况副作用总是会被消除的,效应并不确定,刻意利用这些东西,是邪门歪道。学IT到这份上,唉~



只是突然遇到,感觉很奇怪,不搞明白总是不甘心啊

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-13 06:11
快速回复:关于数组超界问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032411 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved