LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1706|回复: 28

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

[复制链接]
发表于 2005-1-19 16:34:28 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void test_ary(int ary[]);

  4. int main(){
  5.      int intary[10];
  6.      test_ary(intary);
  7.      exit(EXIT_SUCCESS);
  8. }

  9. void test_ary(int ary[]){
  10.      int i;
  11.      for(i=0; i<15 ; ++i){
  12.          ary[i]=i;
  13.          printf("The num is %d\n",ary[i]);  //这个循环有15次,而数组只是10个元素的,
  14.                                                         //居然不出现段错误?迷惑中啊!
  15.                                                         //我用的是FC2!
  16.      }
  17. }
复制代码

:help 请大家帮忙看看,这么不报错?
发表于 2005-1-19 16:43:21 | 显示全部楼层
数组实际上是指针
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-19 16:55:56 | 显示全部楼层
这个知道啊,但是分配数组是只要了10个单元,怎么后面到了15,还是能继续下去呢?应该出现错误才对啊!
回复 支持 反对

使用道具 举报

发表于 2005-1-19 16:56:34 | 显示全部楼层
只要程序访问的是本进程地址空间内的数据,并且这些数据是可以写的,就不会出段错误。这也是许多“缓冲区溢出”错误的来源。
回复 支持 反对

使用道具 举报

发表于 2005-1-19 18:13:28 | 显示全部楼层
C的指针太强大了
回复 支持 反对

使用道具 举报

发表于 2005-1-19 18:21:53 | 显示全部楼层
Post by osfans
数组实际上是指针


呵呵,论坛中有一个讨论指针与数组的贴子,应该去看看,你这么认为是很危险的。
回复 支持 反对

使用道具 举报

发表于 2005-1-19 18:56:45 | 显示全部楼层
Post by jiangbo409
C的指针太强大了

这和C语言指针的强大有什么关系,错误的程序也不会因为使用了强大的指针就变成正确的啦。
还是自己小心处理数组下标越界吧。
回复 支持 反对

使用道具 举报

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

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

  2. void test_ary(int ary[] int 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. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-19 21:43:13 | 显示全部楼层
楼上的朋友,不好意思,写上论坛的时候写错了。
但是我的遇到的问题是,数组这个错误在linux下居然能执行,而且没有报错,很不解!
试着在windows中运行,也能运行到15,不过会报内存错误!
回复 支持 反对

使用道具 举报

发表于 2005-1-19 22:39:23 | 显示全部楼层
编译的问题~~c的编译器就是这样设计的为了简便~。
至于报错是操作系统的如何管理内存的问题~
回复 支持 反对

使用道具 举报

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

本版积分规则

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