从数组越界看栈空间的分配

Code:
  1. int x=35;   
  2. char str[10];   
  3. strcpy(str,"www.it315.org"/*共13个字母*/);   
  4. /*问此时x的值是多少*/  

      在VC6.0里值 x=103; 大部分人都知道这是数组越界了,但为什么x是103呢?    

      栈的分配是从高低址到低地址,VC里栈内存对齐为变量分配的空间大小一般以4 Byte递增,特殊情况除外。所以程序未执行第三句前,内存状态是这样的。

                               

       一般PC机的CPU是Little-endian模式,Little-endian模式的CPU对操作数的存放方式是从低字节到高字节。一个测试你电脑CPU是Little-endian模式还是Big-endian模式(对操作数的存放方式是从高字节到低字节)的程序,具体实现如下:

Code:
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. int checkCPU()   
  5. {      union w   
  6.        {    
  7.             int a;   
  8.             char b;   
  9.        } c;   
  10.        c.a = 1;   
  11.        return (c.b == 1);   
  12. }   
  13.   
  14. int main()   
  15. {   
  16.     if (checkCPU())   
  17.         cout<<"本系统是 Little endian 模式:CPU对操作数的存放方式是从低字节到高字节"<<endl;   
  18.     else  
  19.         cout<<"本系统是 Big endian 模式:CPU对操作数的存放方式是从高字节到低字节"<<endl;   
  20.     return 0;   
  21. }  

      联合体union的存放顺序是所有成员都从低地址开始存放,所以通过这个方法可以测出CPU的模式。

      当程序运行完strcpy(str,"www.it315.org"/*共13个字母*/); 这行后,内存状态变为: 

                        

        CPU对字符的存放放式是从低字节到高字节,而本例的运行环境CPU对数值的存放方式是Little-endian模式(即也是从低字节到到字节)。所以从内存0012FF20处数值部分(x=35,35的二进制表示小于一个字节)被字符部分完整覆盖,而覆盖的字符g的ASCII值是103,所以x的数值表示就成103。

你可能感兴趣的:(c,测试,byte)