注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

C的缺陷-pitfalls总结(二)  

2014-07-23 20:34:59|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3、 运算符的优先级。

优先级问题

表达式

表达式意思

的优先级高于*

*p.f

*(p.f),对pf偏移

[] 高于*

int  *arr[]

int  *(arr[]),表示arr是个指针数组

函数()高于*

int  *fp()

int *(fp())fp是个函数,返回值为int *

==和!=高于位操作符

(val &m!=0)

val  &(m!=0)

==和!=高于赋值符

a=getchar()!=EOF

c=(getchar()!=EOF)

算术运算符高于移位运算符

m<<2+n

m<<(2+n)

逗号运算符在所有运算符中最低

i=12

(i=1),2

 

 

4、容易被遗漏的空格。

       一般情况下,在程序语句中,多打几个空格,少打几个空格都无所谓的。但是在一些特定情况下,少了空格还真的不行,特别是进行运算时。比如:

z = x+++y;

显然,从字面上看这句代码有两个意思z = x++ +y;z = x+ ++y;,编译器是按照前者来解析的,有可能和程序员的本来意图相反。ANSI C规定了一种最大一口策略Maximal Munch Strategy),这样解析的时候便会选取能组成最长字符序列的方案。再比如:

z = x+++++y;

编译器解析这句便会出错,编译器是这样解析的:

z = x++ ++ +y;

如果在适当的位置加上空格,如:

z = x++ + ++y;

则可以顺利通过编译。还有一种情况:

z = *x/*y;

本意是指针x指向的值去除以指针y指向的值,但是由于少了空格,解析的时候便会把“/*”解释为注释符,那么本句之后的所有代码都当做注释对待了。正确的是:

z = *x / *y;

说到注释,有必要提一下CC++的微小差异。C++并未对C中大多数缺陷进行修正,但也有一些小的修正,拿注释符来说:

a //*

//*/ b

这在C中表示a/b,但在C++中表示a

虽然这些问题看似简单,但是我们在编写程序的时候很有可能会疏忽。


5、局部指针变量值返回。

假设有这样一个函数:

int func(){

...

int buffer[MAX];

...

return buffer;

}

返回值是数组,由于buffer是一个自动分配内存的数组,是函数的局部变量。当控制流离开声明自动变量的范围时,自动变量便自动失效。因此,上例中返回的数组已经被销毁,那么这个指针指向的地址是随意的。当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,它们的内容肯定会被下一个所调用的函数覆盖。这一切取决于堆栈中先前的自动变量位于何处,活动函数声明了什么变量,写入了什么内容等。

解决方案有:


  • 1、返回指向字符串常量的指针。

  • 2、使用全局数组。不过这个有安全隐患,全局数组每个可以被任何人修改。

  • 3、使用静态数组。可以防止任何人修改数组,由于静态数组和全局数组,都有可能闲置,并存在于大型缓冲区,造成空间浪费。

  • 4、利用malloc显式分配一定量内存。这样在每次调用时都会创建一个新的缓冲区,所以不会以后的调用不会覆盖以前的返回值。但要程序员手动去管理内存的分配。

  • 5、要求调用者分配内存来保存函数的返回值,同时指定缓冲区的大小。

void func(char *result,int size){

...

}

buffer = malloc(size);

func(buffer,size);

...

free(buffer);

  评论这张
 
阅读(20)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017