[QUOTE=zhuomingliang]楼主试试这个( Y& `7 S2 k9 O, j7 y/ f
#include <stdio.h>
1 C; P9 \9 s, m; ?" Y#include <stdlib.h>( }. {0 `" W- s- {0 h
1 q6 |5 V4 o" U' ^2 I3 h5 ~#define BIGNUM 50
+ i" p) G* {5 u- Z8 |
8 X4 x* B1 q5 y& W5 gvoid index_to_the_moon(int arr[]);
2 v7 d* C' ], x& ^* Z / h' ^) w; X* T) c. [
int main(void), K$ T% f( T9 F' f4 ]
{1 Q6 v# ]5 g" e2 E" L7 [9 ]& ^( J
int intary[10];; I. E+ ?: x: U
index_to_the_moon(intary);! m" S& O) n( Y6 v1 b5 u1 ?
0 d/ ?( j7 u5 b# _. freturn 0;$ k; u# T3 e$ i# Z% f9 T! I. Y' y' `
}
# I8 W. ^# W X: e0 }: {5 _( g 8 |( U& P @% o# ]
void index_to_the_moon(int arr[])' ^7 S8 l! o2 j! C- x+ n7 n9 n
{! o/ S7 |7 ~) P3 E" M! O
int i;
* k3 \4 b# ], y' ]) J8 l, [for(i=0;i<BIGNUM;i++)9 V D4 J, ^9 N* O/ `
{
& M0 U; C8 R$ f: L# z*arr=i;
; \' u3 Z# j$ q5 x0 u) V3 ?printf("%d\n",*arr++);
1 }3 O4 w4 G) i0 \# p# r}
6 R) Y6 v& @3 P7 X& e7 G}[/QUOTE]
1 X3 x4 i' w0 d' M' B* h
" n& ]! E2 o& [0 h这段代码和楼主的最大不同是,main中调用的是return 0 而不是exit()。
, U. x5 x1 H9 H" W! r2 i* u% A2 I5 x r" g
众所周知,对于IA32, 运行栈往低地址增长。return导致 main返回,运行栈退到上一帧,而上一帧已经被 index_to_moon() 破坏光了,包括原先栈中保存的指令指针值(IP)也被修改了,自然会段错误。: b1 R/ _8 L7 N" @7 L6 s
. ~5 u% X' X- q& e
而exit() 执行了什么? exit() 被调用后,运行栈不是退栈到上一帧,而是直接调用 atexit() 例程注册的 函数中, 然后再调用 _exit(), 返回控制权给操作系统。 而atexit() 注册的函数栈桢位置处在更低的地址空间(atexit注册的函数直接在main下面开辟栈桢),没被 index_to_moon 破坏掉,因此程序没有发生段错误。但不要乐观,把BIGNUM改到足够大,一定也会段错误的。