栈区的地址增长方向与buf地址的增长方向是两个完全不同的概念

17 篇文章 1 订阅

一、栈区的地址增长方向

这里写图片描述

要想验证栈区究竟是开口向上还是开口向下,都进行先压变量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地址的增长方向是两个完全不同的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值