一、栈区的地址增长方向
要想验证栈区究竟是开口向上还是开口向下,都进行先压变量a再压变量b的操作,若a的首地址比b的首地址大则说明开口向下,若b的首地址比a的首地址大,则说明开口向上,下面就用代码来验证一下:
#include"stdio.h"
#include"stdlib.h"
int main() {
int a;
int b;
printf("&a : %d\n", &a);
printf("&b : %d\n", &b);
system("pause");
return 0;
}
debug下的输出结果:
release下的输出结果:
可以看到两个版本下,a的首地址始终比b的首地址大,基本可以判定栈区的开口向下的,有的人的release版本可能会出现a的首地址始终比b的首地址小的情况,其实这个也无关要紧。
栈区开口向下主要便于避免栈溢出的问题,定义一个开始的最大值,然后开口向下压栈,直到0就不能压栈了。
二、堆区的地址增长方向
#include"stdio.h"
#include"stdlib.h"
int main() {
int *a= (int*)malloc(10);
int *b = (int*)malloc(10);
printf("a : %d\n", a);
printf("b : %d\n", b);
system("pause");
return 0;
}
输出结果:
可以看到堆区是开口向上。
三、buf地址的增长方向
不管栈区的开口方向如何,对于栈空间中的buf地址的增长方向都是向上的,如果增长方向向下,对buf首地址+1时岂不是跑到其他内存空间去了。
三、小结
1、栈区开口向下(一般情况);
2、堆区开口向上;’
3、栈区的地址增长方向与buf地址的增长方向是两个完全不同的概念。