问题:给结构体指针的成员赋值失败,且输出的值很乱。
废话少说,直接看现象:
结构体定义:
为了演示,用词相对比较简单。
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();
}
需要先定义一个结构体变量,然后把结构体变量的地址赋值给结构体指针,再通过结构体指针的箭头运算符来修改成员变量,问题即可解决。告辞!
转载请标注作者。