打印
[STM32F1]

请教指针问题

[复制链接]
688|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 | 只看该作者
而且有时有告警,有时没告警,没点规律

使用特权

评论回复
5
dalarang| | 2020-12-26 17:09 | 只看该作者
if(arr==1) 判断该指针指向的地址是不是1
if(*arr==1) 判断该指针指向的地址的值是不是1
两者都是可以编译通过的,但是含义不同

使用特权

评论回复
6
qiangtech| | 2020-12-28 09:30 | 只看该作者
dalarang 发表于 2020-12-26 17:09
if(arr==1) 判断该指针指向的地址是不是1
if(*arr==1) 判断该指针指向的地址的值是不是1
两者都是可以编译 ...

是这样的,编译器可管不了逻辑的。

使用特权

评论回复
7
ayb_ice| | 2020-12-28 09:34 | 只看该作者
一个是给指针本身赋值,一个是给指针指向的对象赋值,编译器哪知道程序员的意图呢,这都是很正常的操作

使用特权

评论回复
8
sonicll| | 2020-12-28 09:48 | 只看该作者
gdszzyq 发表于 2020-12-26 16:56
而且有时有告警,有时没告警,没点规律

警告时有时无,可能和你编译用的是build还是rebuild有关系,第一次build或者rebuild,会报告完整的警告信息,从第二次build开始,只会对新修改的内容进行警告,之前警告过的就不再警告了

使用特权

评论回复
9
a511484095| | 2020-12-28 14:36 | 只看该作者
gdszzyq 发表于 2020-12-26 16:55
语法是没问题,但没有arr这个变量啊,为什么if(arr=1)这句没告警?

这个是函数调用的形参 也就是b函数调用的那个指针存放的地址 地址为什么不能=1?

使用特权

评论回复
10
labasi| | 2021-1-11 12:52 | 只看该作者
因为你不是有语法问题

使用特权

评论回复
11
paotangsan| | 2021-1-11 12:53 | 只看该作者
这种时候只能靠人工检查

使用特权

评论回复
12
renzheshengui| | 2021-1-11 12:55 | 只看该作者
7喽的解释很不错

使用特权

评论回复
13
wakayi| | 2021-1-11 12:57 | 只看该作者
只要不违反语法规则就不会报错或者警告啊

使用特权

评论回复
14
wowu| | 2021-1-11 13:00 | 只看该作者
如果有意外的结果的话 只能进行人工排除了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

322

帖子

3

粉丝