OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4885|回复: 7

变量取地址之后【地址指针+1】奇怪的结果:求原子老大

[复制链接]

80

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2014-9-30
在线时间
129 小时
发表于 2022-5-28 19:31:30 | 显示全部楼层 |阅读模式
18金钱
有时候:看似很简单的 赋值语句,居然都 离奇了,
—— 不得不:求 原子老大 给看看 ——
程序很简单:就是 把有符号短整数 重新装配 一下 ,
—— 以便于 串口 “一口气” 去发送 SndBuf[8]
  uint8_t SndBuf[8]="xxC3456X";
  short int L_spd=3,R_spd=6;        // 定义:带符号的“短整数”
  uint8_t *addr_L,*addr_R;            // 定义指针
    L_spd =-32765;      // 临时 测试 负数 。
    R_spd = 32765;
    SndBuf[3] = *(&L_spd);
    SndBuf[4] = *((&L_spd) +1);
    SndBuf[5] = *(&R_spd);
    SndBuf[6] = *((&R_spd) +1);
    HAL_Delay(2);
100.png
上图 —— 初始化 之后 一切都 很正常 ——
101.png
仔细观察之后发现 它的【指针+1】恰好是
隔空 +1 ” 于是 就出现了 03 fd fd 00 的奇怪结果 。


这问题 怎么 去 改正确 呢 ?? 先 多谢 各位高手 。



最佳答案

查看完整内容[请看2#楼]

你没有理解数据类型和指针意义。 &L_spd就是一个shot int类型指针,当然指针+1就是地址+2了。如果你是int那就是+4了。如果你是一个结构体,那结构体指针+1,等于地址偏移整个结构体大小。 这里你要想指针加1,地址只偏移1个字节,得强制转换一下类型,这样写:(uint8_t *)(&L_spd)+1就行了 实际上是把short指针转化成uint8_t*指针,然后指针+1,就是地址偏移一个字节;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-5-28 19:31:31 | 显示全部楼层
你没有理解数据类型和指针意义。

&L_spd就是一个shot int类型指针,当然指针+1就是地址+2了。如果你是int那就是+4了。如果你是一个结构体,那结构体指针+1,等于地址偏移整个结构体大小。

这里你要想指针加1,地址只偏移1个字节,得强制转换一下类型,这样写:(uint8_t *)(&L_spd)+1就行了

实际上是把short指针转化成uint8_t*指针,然后指针+1,就是地址偏移一个字节;
回复

使用道具 举报

80

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2014-9-30
在线时间
129 小时
 楼主| 发表于 2022-5-28 19:36:04 | 显示全部楼层
本帖最后由 caosix 于 2022-5-28 19:38 编辑

编译器 【自作聪明】它把 “(&L_spd) +1)
取出来的地址 带着 双字节 的 默认属性
于是 +1 就变成了 偶数跳跃 。气死人了。


【现在的问题是——请问 怎么 解决 它 】
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-5-28 20:14:17 | 显示全部楼层
和编译器有啥关系 本来就是这么规定的
地址的操作和你的变量类型有关

这是其中一种实现方法 可能不是最优解

test.jpg
回复

使用道具 举报

80

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2014-9-30
在线时间
129 小时
 楼主| 发表于 2022-5-28 20:54:42 | 显示全部楼层
babyrabbit 发表于 2022-5-28 20:14
和编译器有啥关系 本来就是这么规定的
地址的操作和你的变量类型有关

谢谢 你的 关注,最后不得不 改变程序的 风格
—— 被迫 采用 —— 联合体 的 写法 “加 . ” ——
102.png


数据 重新组装的问题 总算是 解决了 。
回复

使用道具 举报

80

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2014-9-30
在线时间
129 小时
 楼主| 发表于 2022-5-28 20:57:11 | 显示全部楼层
babyrabbit 发表于 2022-5-28 20:14
和编译器有啥关系 本来就是这么规定的
地址的操作和你的变量类型有关

   我需要 重新组装 的是“有符号 整数”。
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-5-28 21:16:14 | 显示全部楼层
caosix 发表于 2022-5-28 20:57
我需要 重新组装 的是“有符号 整数”。

有符号无符号都一样 数据长度都是固定的 就是最高位要不要当成符号位的区分 程序里都把unsigned抹掉就有符号了 就是为了实现下功能而已
回复

使用道具 举报

9

主题

218

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1395
金钱
1395
注册时间
2020-5-12
在线时间
387 小时
发表于 2022-5-28 22:28:03 | 显示全部楼层
SndBuf[3] = *(&L_spd); 改为 SndBuf[3] = (uint8_t *)&L_spd;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表