一个关于c语言溢出的有关问题

一个关于c语言溢出的问题.
程序代码如下:
#include   "stdio.h "
#include   "string.h "
//char   s[]={ "abcdefghijklmnopqrstuvwxyz "};
void   main()
{
char   s[]={ "abcdefghijklmnopqrstuvwxyz "};
char   d[8];
int   i;
strcpy(d,s);

for(i=0;i <8&&d[i];i++)
printf( "0x%x ",d[i]);
}
将s定义为全局变量会发生溢出,可是定义成局部变量就不会出现错误!!!为什么呢?
各位大虾   SOS   me~~~

------解决方案--------------------
都会溢出,定义为局部变量是将数组分配在栈中,如果没有报错,只能是走运!
---------------------------------------
是这样的.
因为栈区是从用户系统空间的高地址往低地址分配,自你的变量往下都是空的,使用时没影响到其他地方,
所以程序不包错,如果你多分配一下这样的变量的话,你就可能得到错误的结果.
全局变量时分配到数据区的,和代码区在一起,你拷贝时就有可能覆盖一些代码数据,运行时就出错了.
------解决方案--------------------
典型的问题:

结果是都溢出.
1.当定义为全局变量的时候是在数据段内.当越界的时候runtime会提示出错.
2.当定义为局部变量的时候,是在栈中.这是典型的黑客惯用伎俩,(缓冲区溢出).当越界的时候runtime先开始不会抱错,但是当越界拷贝完之后,影响了函数栈中的参数,返回地址的时候,runtime才会抱错.