[STM32F1] 请教指针问题

[复制链接]
880|13
 楼主| gdszzyq 发表于 2020-12-26 13:39 | 显示全部楼层 |阅读模式
以下函数使用了指针,但有时忘记输入*指针符号,却没有告警,编译也能通过,请问为什么会这样。
void a(void)
{
    static unsigned char test;
    ....
    b(&test);
}
void b(unsigned char *arr)
{
     if(arr==1)  //arr前忘记加指针符*,当a函数的test这个变量为1时不能进入循环,说明指针没有传递进来
     {
          ...
          *arr=0;
     }
}
整个工程都没有定义arr这个变量,编译器有时不告警,有时会告警,而且还编译通过了,只是运行时指针不会传递进来,如果这样用指针真是太危险了,因为很有可能忘记加这个*,而出了问题很难查找原因,请问是不是MDK哪里有设置可以检查这种语法错误
qiangtech 发表于 2020-12-26 16:29 | 显示全部楼层
因为你这个不是语法错误,在语法上,你这样写是能解释得通的。只是与你期望的逻辑不同。
 楼主| gdszzyq 发表于 2020-12-26 16:55 | 显示全部楼层
qiangtech 发表于 2020-12-26 16:29
因为你这个不是语法错误,在语法上,你这样写是能解释得通的。只是与你期望的逻辑不同。 ...

语法是没问题,但没有arr这个变量啊,为什么if(arr=1)这句没告警?
 楼主| gdszzyq 发表于 2020-12-26 16:56 | 显示全部楼层
而且有时有告警,有时没告警,没点规律
dalarang 发表于 2020-12-26 17:09 | 显示全部楼层
if(arr==1) 判断该指针指向的地址是不是1
if(*arr==1) 判断该指针指向的地址的值是不是1
两者都是可以编译通过的,但是含义不同
qiangtech 发表于 2020-12-28 09:30 | 显示全部楼层
dalarang 发表于 2020-12-26 17:09
if(arr==1) 判断该指针指向的地址是不是1
if(*arr==1) 判断该指针指向的地址的值是不是1
两者都是可以编译 ...

是这样的,编译器可管不了逻辑的。
ayb_ice 发表于 2020-12-28 09:34 | 显示全部楼层
一个是给指针本身赋值,一个是给指针指向的对象赋值,编译器哪知道程序员的意图呢,这都是很正常的操作
sonicll 发表于 2020-12-28 09:48 | 显示全部楼层
gdszzyq 发表于 2020-12-26 16:56
而且有时有告警,有时没告警,没点规律

警告时有时无,可能和你编译用的是build还是rebuild有关系,第一次build或者rebuild,会报告完整的警告信息,从第二次build开始,只会对新修改的内容进行警告,之前警告过的就不再警告了
a511484095 发表于 2020-12-28 14:36 | 显示全部楼层
gdszzyq 发表于 2020-12-26 16:55
语法是没问题,但没有arr这个变量啊,为什么if(arr=1)这句没告警?

这个是函数调用的形参 也就是b函数调用的那个指针存放的地址 地址为什么不能=1?
labasi 发表于 2021-1-11 12:52 | 显示全部楼层
因为你不是有语法问题
paotangsan 发表于 2021-1-11 12:53 | 显示全部楼层
这种时候只能靠人工检查
renzheshengui 发表于 2021-1-11 12:55 | 显示全部楼层
7喽的解释很不错
wakayi 发表于 2021-1-11 12:57 | 显示全部楼层
只要不违反语法规则就不会报错或者警告啊
wowu 发表于 2021-1-11 13:00 | 显示全部楼层
如果有意外的结果的话 只能进行人工排除了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

322

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部