| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 755 人关注过本帖
标题:为什么那么多警告?如何消掉它?
只看楼主 加入收藏
hywhll888
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2011-6-9
收藏
得分:0 
回复 10楼 TonyDeng
D:\我的文档\桌面\no601.c(18) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)[5]'
D:\我的文档\桌面\no601.c(19) : warning C4047: 'function' : 'int (*)[5]' differs in levels of indirection from 'int *'
D:\我的文档\桌面\no601.c(19) : warning C4024: 'pjf' : different types for formal and actual parameter 1
D:\我的文档\桌面\no601.c(20) : warning C4047: 'function' : 'int (*)[5]' differs in levels of indirection from 'int *'
D:\我的文档\桌面\no601.c(20) : warning C4024: 'bjg' : different types for formal and actual parameter 1
D:\我的文档\桌面\no601.c(21) : warning C4047: 'function' : 'int (*)[5]' differs in levels of indirection from 'int *'
D:\我的文档\桌面\no601.c(21) : warning C4024: 'yx' : different types for formal and actual parameter 1


贴出来了 怎么消掉呀
2011-07-28 21:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
18行,q=a语句,赋值类型不匹配,q是指向int的指针,但a是int,你将整数值赋给指针,编译器肯定怀疑你的指针值不正常(某些情况下确实可能有这么小数值的指针地址,但通常不会),所以尽管不能说错,但必须给出警告。事实上,这个赋值就是错的,你应该把a的地址赋给q,即q=&a,而不是q=a。

警告类一般是一连串的,先解决一个,再编译一次,会发现后面的警告会消失一些。逐个来,直到没有为止。

授人以渔,不授人以鱼。
2011-07-28 22:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
后面的,你自己解释一下这样的参数是什么意思?
void pjf(int (*q)[5]);

pjf()函数要一个整数int,这个int是通过指针q给出的,后面再带一个数组下标,连编译器都不知道你想干什么,我也看不明白,你自己说得清楚吗?

授人以渔,不授人以鱼。
2011-07-28 22:16
guanzhe
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2011-7-28
收藏
得分:0 
无视。不影响结果~~
2011-07-28 22:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
第18行是致命的问题,一个int数值很小,如果作为指针地址,意味着它的位置非常靠前,那不是系统区就是程序代码区,一写下去,不是破坏系统就是程序代码,编译器给出警告是相当聪明了。无视它?那叫找死。

什么叫指针?指针其实也是整数,只不过当你声明q是指针的时候,程序会认为那是内存中某个位置的门牌号码,而int、long之类就视为确实的数值。所以在实际上,指针和int是同一类型的,两者之间确实可以赋值和转换,正是因此,编译器才无法确定你的真正意图是不是真的要让指针q的地址等于数值a,因为这在C中是合法的,所以编译器只能给出警告,即提醒注意,但不能说那是错误。

这种行为会产生破坏性后果,如果操作系统强壮,一旦发现你试图破坏被保护区域,会拦截你,但不是任何系统都会做这种保护,在DOS下就不会保护,任你写,把自己弄瘫痪为止,死机、蓝屏之类就是这样产生的,在NT,可能会弹出错误对话框然后体面地结束程序。

C有多危险,是你们初学者不知道的,人家说C是神器,非学不可,什么事都能做,实际上就是能做这种极其危险的事,动不动就对系统、硬件做手脚,如果你不熟悉那些东西,等于小孩子拿着AK47乱射。

授人以渔,不授人以鱼。
2011-07-28 22:33
hywhll888
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2011-6-9
收藏
得分:0 
回复 15楼 TonyDeng
我找到问题了 把int *q 改成(*q)[5],就可以了
2011-07-28 22:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C的指针功能非常方便,因此而强大,但我们要想一想,如果指针那么好使,为什么别的语言不提倡?(在pascal,要用指针必须有非常明显的标识,让程序员确实知晓自己在使用指针,而不是无意中使用了指针)为什么作为C加强版的C++对指针的使用作了那么多的限制?所有有经验的程序员和专家,都不提倡滥用指针,如果能够用数组下标表达,绝不应写成指针形式,是否转换为指针执行,由编译器来决定,但人不要自作聪明做这种事,须知安全性才是第一位的。

这里很多人写程序,动不动就指针版本,以为很高明,其实是学出坏习惯。任何一本C++的教科书,都明白告诉读者指针有什么问题,如何避免,C++语法也努力规范这个问题。

授人以渔,不授人以鱼。
2011-07-28 22:46
快速回复:为什么那么多警告?如何消掉它?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024938 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved