LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: randypig

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

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

就是能执行啊,有人经常说的野指针,在这里也算是一种情况。
数组越界,指针未初始化就使用等,这些问题编译器是不检查的,就是运行的时候出错,呵呵
回复 支持 反对

使用道具 举报

发表于 2005-1-26 13:28:05 | 显示全部楼层
Post by xxbview
顶,我觉得这样是很好的习惯!

不仅仅是习惯的问题,精典教材上都是这么写的啊

如果你不指定array_size,如果给别人用你的函数,你怎么能确定他的数组的大小?
回复 支持 反对

使用道具 举报

发表于 2005-1-26 17:20:56 | 显示全部楼层
这贴子 越看越晕
回复 支持 反对

使用道具 举报

发表于 2005-2-9 13:55:35 | 显示全部楼层
有没有关于防止数组越界的泛型算法啊!
回复 支持 反对

使用道具 举报

发表于 2005-2-9 20:28:17 | 显示全部楼层
C不会帮你自动检查指针溢出的。
回复 支持 反对

使用道具 举报

发表于 2005-2-11 14:53:28 | 显示全部楼层
C和C++一般不检查数组指针越界问题,不报错。
C++的vector类模板就可以看作一个数组类,提供的方法很多,当然也包括数组长度方法size(),它甚至还提供数组的动态增长方法insert(...)和push_back(),你用它试试。效果8错。

C++中更一般的遍历方法是使用迭代器iterator,如:

vector<int> a(10);
vector<int>::iterator it=a.begin();
for(;it!=a.end();it++)
{
  ...
}
回复 支持 反对

使用道具 举报

发表于 2005-2-11 22:01:54 | 显示全部楼层
Post by randypig
试着在windows中运行,也能运行到15,不过会报内存错误!

你在windows下是用VC写的吗?Debug模式下好像会添加一些测试的代码。
回复 支持 反对

使用道具 举报

发表于 2005-2-13 23:16:42 | 显示全部楼层
osfans 说数组实际上是指针 只是为了说明两者的相似处
    :    数组相当于一个 指向固定内存地址 的指针

对数组的操作完全要靠程序员自己来控制,下面是原来程序的一些修改
用来说明问题

#include <stdio.h>
#include <stdlib.h>

void test_ary(int ary[]);

int main(){
     int as[10],intary[10] ;   ///  添加了一个  as 数组!
     int i;     

     printf("\n\n%d  :   %d   : %d\n\n", intary, as);


     test_ary(intary);

     printf("\n......................\n\n");
     for(i=0;i<10;i++)
       printf("   %d  ||", as);   
   
     exit(EXIT_SUCCESS);
}

void test_ary(int ary[]){
     int i;
     for(i=0; i<15 ; ++i){        ////  会影响到 main 里面的  as 数组!
         ary=i;
         printf("    %d ..",ary);   
                                                      
     }
}
  

系统给intary分配了一个可以使用的空间(即不被其他程序使用,初始为随机值)

as数组的空间   intary空间之前分配,但是 地址值却大(分配地址从小往大,因为是堆栈)
可以通过 printf("as address is :  %d    comparing  with intary address : %d  \n ", as, intary);
查看地址

添加as 数组的目的就是说明 test_ary(int ary[])  函数越界后会对  as数组造成影响
我机子里面的地址显示是  intary数组除了10个int的空间外 后面又添加了 2个int的空间,
  之后才是  as数组的 空间.
/***
   这个2个int空间我想不清楚为什么,我用char数组是添加了6个char空间.
    或许每个 编译器有所不同. 我想如果是为了分清界限添加多余空间的话也没什么道理,
   反正编译器会对它们进行管理.  ----- 这个没搞清楚
***/                

在test_ary(int ary[])之后,as 数组内容会被部分影响到(前3个变成 12,13,14)
回复 支持 反对

使用道具 举报

发表于 2005-2-13 23:26:52 | 显示全部楼层
说上面这些的目的是
   c里面数组根本不会对界限进行管理,它只会按照我们程序员的命令 对它(数组)所指的地址执行     相应的操作.
    在上面程序中,还算是安全的. 但是如 as数组被部分更改 所提示我们的, 如果我们在编写程    序是不对界限作限制的话,是会出问题的.  (如 mikkoyue 所说)
    很显然的一个可能就是比如
          上面程序里面的as是处理某种重要信息,但是莫名其妙就被一个和它根                 本没关系的 test_ary()函数改了  
    其他还有的情况就是 数组越界后的空间分配给了其他程序,但是还是要对它修改.
    这时,要么会出现空间被保护,无法修改; 要么就是 影响其他程序(部分病毒原理)

 
回复 支持 反对

使用道具 举报

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

本版积分规则

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