栈区的地址增长方向与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地址的增长方向是两个完全不同的概念。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,如果要进行上坡检测,需要考虑两个方向上的加速度值。一般情况下,上坡检测需要根据两个方向上的加速度值和重力加速度值进行比较,以消除重力的影响。以下是一个考虑两个方向上的上坡检测代码,供你参考: ``` #include <reg52.h> #include <intrins.h> #define MPU6050_ADDRESS 0xD0 sbit SCL = P1^1; sbit SDA = P1^0; void delay(unsigned int t); void I2C_start(); void I2C_stop(); void I2C_send_byte(unsigned char dat); unsigned char I2C_receive_byte(); void MPU6050_init(); void MPU6050_read(unsigned char reg, unsigned char *buf, unsigned char len); void MPU6050_write(unsigned char reg, unsigned char dat); void MPU6050_get_accel(short *accel); unsigned char detect_slope(short *accel); void main() { short accel[3]; unsigned char slope; MPU6050_init(); while(1) { MPU6050_get_accel(accel); slope = detect_slope(accel); if(slope) { // 发现上坡,执行相应的操作 // ... } delay(10); // 延时10ms } } void delay(unsigned int t) { while(t--) { _nop_(); _nop_(); } } void I2C_start() { SDA = 1; SCL = 1; delay(1); SDA = 0; delay(1); SCL = 0; } void I2C_stop() { SDA = 0; SCL = 1; delay(1); SDA = 1; delay(1); } void I2C_send_byte(unsigned char dat) { unsigned char i; for(i = 0; i < 8; i++) { SDA = (dat & 0x80) >> 7; dat <<= 1; delay(1); SCL = 1; delay(1); SCL = 0; } SDA = 1; delay(1); SCL = 1; delay(1); SCL = 0; } unsigned char I2C_receive_byte() { unsigned char i, dat = 0; SDA = 1; for(i = 0; i < 8; i++) { SCL = 1; delay(1); dat = (dat << 1) | SDA; SCL = 0; delay(1); } return dat; } void MPU6050_init() { MPU6050_write(0x6B, 0x00); // 设置 MPU6050 为唤醒状态 MPU6050_write(0x1C, 0x00); // 设置加速度计量程为 ±2g } void MPU6050_read(unsigned char reg, unsigned char *buf, unsigned char len) { unsigned char i; I2C_start(); I2C_send_byte(MPU6050_ADDRESS); I2C_send_byte(reg); I2C_start(); I2C_send_byte(MPU6050_ADDRESS | 0x01); for(i = 0; i < len; i++) { buf[i] = I2C_receive_byte(); if(i < len - 1) { SDA = 0; delay(1); SCL = 1; delay(1); SCL = 0; } } I2C_stop(); } void MPU6050_write(unsigned char reg, unsigned char dat) { I2C_start(); I2C_send_byte(MPU6050_ADDRESS); I2C_send_byte(reg); I2C_send_byte(dat); I2C_stop(); } void MPU6050_get_accel(short *accel) { unsigned char buf[6]; MPU6050_read(0x3B, buf, 6); accel[0] = (buf[0] << 8) | buf[1]; accel[1] = (buf[2] << 8) | buf[3]; accel[2] = (buf[4] << 8) | buf[5]; } unsigned char detect_slope(short *accel) { // 检测加速度计 z 轴的数值是否大于某个阈值,如果大于则认为是上坡 // 同时检测加速度计 x 轴的数值是否小于某个阈值,如果小于则认为是上坡 return (accel[2] > 1000 && accel[0] < -200); } ``` 这段代码在上坡检测时,同时检测了x轴和z轴的加速度值。具体的阈值需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值