| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1823 人关注过本帖
标题:关于数组超界问题
只看楼主 加入收藏
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
以下是引用TonyDeng在2013-8-13 00:33:31的发言:

在栈上的变量,必然是连续分配的,再加上向上或向下增长,这只是一种实现假定,尽管某些编译器确实是这样做的,但并不是所有编译器都会这样做,因为标准也没规定编译器必须这样分配变量,那是编译器的自由,编译器可能会察觉这样的漏洞,采取预防措施,那些措施未必是我们所知道的(比如跳过一些间隙分配,踏入间隙读写即触发系统保护机制,谁知道编译器设计者会怎么做),也不需要知道,只要规规矩矩地写出不越界的代码即可,越界之后有什么现象,与你无关,研究它不见得你是高手。

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

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



好了斑竹,不研究了,多谢

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-13 06:37
awisebird_
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:185
注 册:2013-7-6
收藏
得分:0 
以下是引用liufashuai在2013-8-12 19:22:09的发言:

这个问题其实也很简单,就是临时变量在栈上分配,而且栈的分配地址是从下到上的,
因此你先定义变量i,在定义数组a[10],其实a[10]的位置就是i的位置,因为
C语言不检查越界情况,所以,当你给a[10]赋值为0的时候就是给i的值赋值0,因此就是死循环

你可以这样:

#include<stdio.h>
int main()
{  
    int i;
    int j;
    int a[10];
    for (i = 0; i <= 10; ++i)
    {   
        a = 0;
        printf("%d\n", i);
    }
return 0;   
}



在它们的定义之间加一个定义,这样给a[10]赋值就是给j赋值,i就不受影响了
但是如果你<=11的话还会受影响的(理论上应该会,我没实验)

试过了,这样的话也是死循环,原理一样,以后要注意。把实质到内存,一切问题就很好解决!

很有道理啊
2013-08-13 12:03
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
http://blog.
特定的内存分配下会这样,不是所有编译器都这样...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-13 13:31
谢跃锋
Rank: 2
等 级:论坛游民
威 望:2
帖 子:50
专家分:77
注 册:2013-4-14
收藏
得分:0 
回复 9楼 liufashuai
能告诉我,你定义的int j有什么作用么?为什么去掉后也会出现错误啊(花屏);
2013-08-14 08:59
快速回复:关于数组超界问题
数据加载中...
 
   



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

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