19 12
发新话题
打印

声明的数组越界,为何还能正确运行,很怪,没有几行代码,大家看看!!!!

声明的数组越界,为何还能正确运行,很怪,没有几行代码,大家看看!!!!

#include <stdio.h>
! C, X* d, ^' Y7 ^#include <stdlib.h>4 D( |. l  r4 p- c+ r
$ M& H/ X& ^9 Q9 Y' f+ v
#define BIGNUM 50! Z" N& t8 j  b" E3 U

6 N  K/ v" W$ B% c6 ]void index_to_the_moon(int arr[]);* ?9 j7 ?& w% m6 h" L
% g" c4 ^6 B1 H8 n
int main(void)
1 ]" f# x0 r% [{
5 }& q. b5 e  I7 w  int intary[10];( N# {8 T! k& n0 y' a
  index_to_the_moon(intary);
/ Y2 I% |1 k2 Z6 A- N+ x) R, X$ p8 {3 j3 X6 E
  exit(EXIT_SUCCESS);
' i. k! I1 x* o9 _( j' ^}
! L* A+ v; A) Z$ @# `
; Q: z1 g0 O2 I* {- V( _void index_to_the_moon(int arr[])
; ]8 X. W+ O! P/ S. Y; c- u{' M8 }& x7 y) n1 ?+ j5 m- c% `
  int i;
# _. \% P+ N  ?! j: K& u- c7 Z  for(i=0;i<BIGNUM;i++)
! C! B2 H# E& y% I* S6 S$ k  {" U/ b2 _* w/ l# ]2 ]* s
      arr=i;
! z5 ^! w* J* @      printf("%d\n",arr);
0 u1 w# @. i) L  }+ t+ i) Z. H2 Z5 C% O9 u
}
5 b$ @4 D0 p+ y$ C" Y" }* Z- [0 \$ d: m# O" }. n4 U
我用make debugme命令编译此程序后,然后键入./debugme来执行该程序,应该产生一个段错误(segmentation default).为何我的程序还能显示出来个50个数字,从0到49????      

TOP

数组越界不一定会导致 segmentation fault      
'
梅须逊雪三分白 雪却输梅一段香

TOP

Sigh!我的程序来源于GNU/Linux编程指南,难道书上弄错了,书上用这个例子讲了一章呀.      

TOP

尽信书不如无书      
'
梅须逊雪三分白 雪却输梅一段香

TOP

可能覆盖的那部分内存,并没有被使用,所以当时是可以使用的。      

TOP

PC机的内存容量普遍很大,所以有时候内存溢出的情况不一定会表现出来。( I% |/ x) i0 m7 F5 `
如果是嵌入式系统的话表现出来的可能性会大很多。      

TOP

楼主试试这个0 G- U5 v8 {+ c, G! W1 v& ]0 y& l
#include <stdio.h>' M; q) ]  M8 j: G- g# l. c
#include <stdlib.h>
  X' z- J# L. M8 n8 t * M6 D# c: o$ x
#define BIGNUM 500 X* M( q) A6 y0 o
! H: n' I& U! ^. D
void index_to_the_moon(int arr[]);
- b* n7 ]1 }" H1 b2 ~
3 j9 Z" M* m# C* S# K3 n- lint main(void)8 x9 ]9 x; R3 f8 i2 ]
{: O5 {8 O3 @; F: u# f& S( ?* Z
int intary[10];
8 e. h# M1 Y* }# F8 _$ P  t: [index_to_the_moon(intary);9 M0 A) o" r& N1 J4 T

' X& ~) O( D  F9 W5 yreturn 0;
0 H4 N5 L0 j7 k+ N5 K% _6 Z}
) X3 ]! g: Z( V/ y9 A& I 6 W8 f% x2 \3 U, P6 P6 x. X
void index_to_the_moon(int arr[])
% `' W. j& l. u5 j# h& z7 ]& x{
" ]: ]! M, E' t" v' Zint i;
1 R. I; q* p7 s8 e6 p1 yfor(i=0;i<BIGNUM;i++)
( t4 |* w$ h" u4 p8 D, C7 ?( L{& N9 i% I8 t; \; i% e( S
*arr=i;! X& E- g$ Y+ Z3 \
printf("%d\n",*arr++);. ^9 Z+ c: T4 m" |* {
}
/ T! X" O- K7 `}      

TOP

C/C++的数组是没有边界的。你访问了声明以外的单元,编译器不会报错。数组的边界是要你自己把握的。
8 ]! v- t+ @; }+ `' ?我的BLOG里有讨论。      
我的BLOG:[url="http://blog.csdn.net/beepbug/"]http://blog.csdn.net/beepbug/[/url]

TOP

C99中有数组类,用这行试试:void index_to_the_moon(int arr[BIGNUM]);/*估计编译不过*/      

TOP

还可以用汇编分析:cc -S $src.c;vi $src.s      

TOP

 19 12
发新话题