栈变化的地址是自高向低分配的,是连续的内存。

之前想到需要引入 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 字节的栈内存。

20 00 00 00、00 00 00 00、20 00 00 00,这 3 个变量按小端存储,方向从右向左可以看出。

如果开启 RTC,那么会多出几个字节的间隔,直接看内存,全是 cc:

图中可以看到下面地址增大,从下往上看是变量的顺序。

	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。

可以看到向高地址方向写入。

这就是在加入函数调用时:

这些位置就是栈帧结构的返回地址。

Windows 下的 G++ 也是一样的。