栈变化

栈增长地址由高往低,堆由低往高

不仅struct 要对齐,之前就觉得奇怪,struct对齐的好处,栈这些怎么就没有,现在验证了,的确也有,不过对齐规则不太一样,栈临时变量也要对齐

在关闭RTC 检查后,以下测试代码VS2013下

	int a = 32;
	int b = 0;
	int c=32;

	cout << (int)&a - (int)&a << endl;
	cout << (int)&b - (int)&a << endl;
	cout << (int)&c - (int)&b << endl;

没问题, 4 4 4 字节直接但是如果把b换为char了呢

输出就是0 -1 -7 了,很明显char 依然被分配了4字节栈内存

210305_rHSP_1391394.png

20 00 00 00 ,00 00 00 00, 20 00 00 00 是这3个变量,由于是小端所以左往右看

如果开了RTC 那么会多分配几个字节,来检查,直观看来,全是cc的

210702_mul3_1391394.png

图中上往下地址增加,我们再看看下面代码


	int a = 32;
	char b[100] ;
	int c=32;

	memset(b, 0x0f, 110);
	cout << (int)&a - (int)&a << endl;
	cout << (int)&b - (int)&a << endl;
	cout << (int)&c - (int)&b << endl;

b溢出,多出来的10字节会往上覆盖掉c的2字节,因为RTC检查分配8字节。c的低端2字节会被写为0x0f;

211445_V53T_1391394.png

溢出的往高地址写

如果在加入函数的调用

211920_qg4l_1391394.png

变量存放位置往栈增长的方向

win下的G++ 也一样

 

 

 

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/750399

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值