LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: randypig

明明有错的代码,偏偏还能编译运行,迷惑中,请指教!

[复制链接]
发表于 2005-1-19 23:31:25 | 显示全部楼层
数组的越界访问要程序员自己控制吧,一般编译器是不管的,运行时系统崩溃了才知道有问题!
回复 支持 反对

使用道具 举报

发表于 2005-1-20 08:29:32 | 显示全部楼层
Post by mikkoyue
把你的自定义函数改一下,你这种写法在逻辑上说来是错误的,危险性在高。

  1. int test_ary(int ary[], int size);

  2. void test_ary([color=Red]int ary[] inst size[/color]) {
  3.      int i;
  4.      for(i=0; i<size ; ++i) { // 这样就行了
  5.          ary[i]=i;
  6.          printf("The num is %d\n",ary[i]);  
  7.      }
  8. }
复制代码


what?
回复 支持 反对

使用道具 举报

发表于 2005-1-20 11:39:07 | 显示全部楼层
Post by doubleelec
呵呵,论坛中有一个讨论指针与数组的贴子,应该去看看,你这么认为是很危险的。


是吗?我怎么不知道呢
回复 支持 反对

使用道具 举报

发表于 2005-1-20 12:03:01 | 显示全部楼层
Post by randypig
楼上的朋友,不好意思,写上论坛的时候写错了。
但是我的遇到的问题是,数组这个错误在linux下居然能执行,而且没有报错,很不解!
试着在windows中运行,也能运行到15,不过会报内存错误!

你还是先去学学操作系统吧。
回复 支持 反对

使用道具 举报

发表于 2005-1-20 12:38:40 | 显示全部楼层
Post by lilyerr
是吗?我怎么不知道呢


http://www.linuxsir.cn/bbs/showt ... %D6%B8%D5%EB+%D5%EB

建议你把它看完,虽然有点长
回复 支持 反对

使用道具 举报

发表于 2005-1-20 12:59:36 | 显示全部楼层
i<15,对于程序用的堆栈来说话肯定是太小了!
所以,如果你真的想看看程序报段错误,有两个办法!

第一个是加大 i 的值(这个只有靠试验了,慢慢加大,看在什么时候程序会报错)
第二个是这样改程序!
void test_ary(int ary[]){
     int i;
     for(i=0; i<16 ; ++i){             //请注意这里的 i 在我的机器上是等于15时,刚好报错
         ary=i;                          //不知道在你的机器是什么样的,你可以增大或减小它!   
                                              //我的机器是rh9,不过应该是一样的
         printf("The num is %d\n",ary);  //这个循环有15次,而数组只是10个元素的,
                                                        //居然不出现段错误?迷惑中啊!
                                                        //我用的是FC2!
     }
}
void call_fun(void)
{
     int intary[10];     
     test_ary(intary);   
}
int main(){
      call_func();
      exit(EXIT_SUCCESS);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 20:18:16 | 显示全部楼层
Post by herberteuler
你还是先去学学操作系统吧。

为什么要叫我去学呢?你怎么知道我没学过!
如果你知道原因,而且你愿意的话,可以清清楚楚的说出来.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 20:26:54 | 显示全部楼层
Post by gotop2004
i<15,对于程序用的堆栈来说话肯定是太小了!
所以,如果你真的想看看程序报段错误,有两个办法!

第一个是加大 i 的值(这个只有靠试验了,慢慢加大,看在什么时候程序会报错)
第二个是这样改程序!
void test_ary(int ary[]){
     int i;
     for(i=0; i<16 ; ++i){             //请注意这里的 i 在我的机器上是等于15时,刚好报错
         ary=i;                          //不知道在你的机器是什么样的,你可以增大或减小它!   
                                              //我的机器是rh9,不过应该是一样的
         printf("The num is %d\n",ary);  //这个循环有15次,而数组只是10个元素的,
                                                        //居然不出现段错误?迷惑中啊!
                                                        //我用的是FC2!
     }
}
void call_fun(void)
{
     int intary[10];     
     test_ary(intary);   
}
int main(){
      call_func();
      exit(EXIT_SUCCESS);
}



哦,明白了,谢谢啦!
回复 支持 反对

使用道具 举报

发表于 2005-1-20 21:10:09 | 显示全部楼层
Post by randypig
为什么要叫我去学呢?你怎么知道我没学过!
如果你知道原因,而且你愿意的话,可以清清楚楚的说出来.

Post by herberteuler
只要程序访问的是本进程地址空间内的数据,并且这些数据是可以写的,就不会出段错误。这也是许多“缓冲区溢出”错误的来源。


这里已经解释了啊,如果学过操作系统,为什么还不明白呢?
回复 支持 反对

使用道具 举报

发表于 2005-1-21 23:56:15 | 显示全部楼层
Post by mikkoyue
把你的自定义函数改一下,你这种写法在逻辑上说来是错误的,危险性在高。

  1. int test_ary(int ary[], int size);

  2. void test_ary(int ary[] inst size) {
  3.      int i;
  4.      for(i=0; i<size ; ++i) { // 这样就行了
  5.          ary[i]=i;
  6.          printf("The num is %d\n",ary[i]);  
  7.      }
  8. }
复制代码

顶,我觉得这样是很好的习惯!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表