关于结构体指针的成员赋值的遇到的现象

问题:给结构体指针的成员赋值失败,且输出的值很乱。

废话少说,直接看现象:

结构体定义:

为了演示,用词相对比较简单。

struct key
{
	uint32_t a;
	uint32_t b;
	uint32_t c;
	uint32_t d;
};

void Text (void)
{
	struct key *M;
	
	M->a = 0;
	M->a = 0;
	M->a = 10;
	M->a = 10;
	
	NRF_LOG_INFO("M->a = 0X%x",M->a); //打印日志,不理解的可以把它看为C语言里的printf
	NRF_LOG_INFO("M->b = 0X%x",M->b);//打印日志,不理解的可以把它看为C语言里的printf
	NRF_LOG_INFO("M->c = 0X%x",M->c);//打印日志,不理解的可以把它看为C语言里的printf
	NRF_LOG_INFO("M->d = 0X%x",M->d);//打印日志,不理解的可以把它看为C语言里的printf
	NRF_LOG_FLUSH();    //把日志显示出来
}

结果:

以为M->a的结果会是0,结果发现结果如下。

刚开始以为是地址,但是把地址打印出来后,并不是地址。

M->a = 0X3EFD0
M->b = 0X0
M->c = 0X3FB54
M->d = 0X20003540

输出M->a,M->b,M->c,M->d的地址如下:

地址之间的差距为4个字节,正好符合数据的类型,和上述的值完全不一样,所以可知给 M->a赋值之后,输出的值既不是0,也不是地址。

a = 0X3FC38
b = 0X3FC3C
c = 0X3FC40
d = 0X3FC44

总结:

所以给结构体指针赋值的时候,要注意方式方法,不能直接赋值。

对策:

建议用圆点运算符赋值(M.a),如果非要用箭头运算符的话(M->a),那就继续往下看,顺便点点关注,点点赞。

void Text (void)
{
	struct key N;
	struct key *M = &N;
	
	M->a = 0;
	M->a = 0;
	M->a = 10;
	M->a = 10;
	
	NRF_LOG_INFO("M->a = 0X%x",M->a);
	NRF_LOG_INFO("M->b = 0X%x",M->b);
	NRF_LOG_INFO("M->c = 0X%x",M->c);
	NRF_LOG_INFO("M->d = 0X%x",M->d);
	NRF_LOG_FLUSH();
}

需要先定义一个结构体变量,然后把结构体变量的地址赋值给结构体指针,再通过结构体指针的箭头运算符来修改成员变量,问题即可解决。告辞!

转载请标注作者。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值