求解堆栈生长方向和大小端问题
测试代码:
- 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';
那么调试版,调试运行后,会弹出一个对话框告诉你有越界行为
[解决办法]
[解决办法]
正常的情况应该是char 是一个byte 所以 地址应该是按照公差1 来递减的。
至于楼主的得到的是不同的情况,应该是在debug 测试的结果,如果改成release,应该就是公差为1递减的。
关于为什么在debug下面会额外分配一些bytes, 这些bytes 是为debug 服务的。