读书人

求解堆栈生长方向和大小端有关问题

发布时间: 2012-11-11 10:07:57 作者: rapoo

求解堆栈生长方向和大小端问题
测试代码:

C/C++ code
#include <iostream>using std::cout;using std::endl;using std::cin;void main(){    //测试大小端//     int a=0x12345678;//     cout<<std::hex;//     cout<<a<<endl;//     unsigned char *p=(unsigned char *)(&a);//     if(0x78==*p)//         cout<<"bignd"<<endl;//     else if(0x12==*p)//         cout<<"little";    //测试地址的生长方向    unsigned char a1='a',b1='b',c1='c',d1='d';    unsigned char * pchar=NULL;    pchar=&a1;    cout<<(int)(&a1)<<endl;    cout<<(int)(&b1)<<endl;    cout<<(int)(&c1)<<endl;    cout<<(int)(&d1)<<endl<<endl;    while (pchar>=&d1)    {        cout<<*pchar<<"    "<<(int)pchar<<endl;        pchar--;    }    char *pr=new char[4];    cout<<endl;    cout<<(int)pr<<endl;    cout<<(int)(pr+1)<<endl;    cout<<(int)(pr+2)<<endl;    cout<<(int)(pr+3)<<endl<<endl;            system("pause");}


结果:
1245052
1245048
1245044
1245040

a 1245052
? 1245051
? 1245050
? 1245049
b 1245048
? 1245047
? 1245046
? 1245045
c 1245044
? 1245043
? 1245042
? 1245041
d 1245040

3674384
3674385
3674386
3674387

请按任意键继续. . .

请问,在栈分配char a1,b1,c1,d1的时候地址为什么相差4个byte,突然想不明白a1后边的三个字节是要做什么?

[解决办法]
rtc选项
http://msdn.microsoft.com/en-us/library/8wtf2dfz(v=vs.90).aspx

调试版为什么要多分配字节,因为这样才好检查前后有没有被越界

比方说程序增加这一句
*(unsigned char*)(&c1+1)='w';

那么调试版,调试运行后,会弹出一个对话框告诉你有越界行为
[解决办法]
探讨

用vs2010行么

[解决办法]
正常的情况应该是char 是一个byte 所以 地址应该是按照公差1 来递减的。
至于楼主的得到的是不同的情况,应该是在debug 测试的结果,如果改成release,应该就是公差为1递减的。

关于为什么在debug下面会额外分配一些bytes, 这些bytes 是为debug 服务的。

读书人网 >C++

热点推荐