随笔-15  评论-2  文章-0  trackbacks-0
今天看到同事写的代码:
char retcode[5];
memset( 
&retcode, 0x00sizeof(retcode) );

因为以前没见过这样的写法,心想retcode本身就是指向字符数组的指针,再加个&不是变成指向指向字符数组指针的指针了吗?结果他告诉我,这样写是可以的,而且可以防止retcode改变类型造成的coredump的情况。

带着怀疑的想法去查了下《C与指针》,还真发现了这种用法。根据书中描述我才知道,这个retcode一般情况下表示的是指向char的常量指针,只有两种情况,数组名所表示的不是指针常量:
   1、当数组名作为sizeof操作符的操作数时。这时sizeof返回的是整个数组的长度,而不是指向数组的指针的长度;
   2、当数组名作为单目操作符&的操作数时。取一个数组名的地址产生的是一个指向数组的指针(和使用数组名效果相同),而不是指向某个指针常量值的指针。

这么一句memset把两种情况都用上了。

------------------------------------------------------------------------------
2010.04.26

今天遇到一个问题,在调zlib的compress的函数的时候总是报Z_STREAM_ERROR,半天都没找到原因,最后发现,我写了下面的代码:
Byte* alObuf;
alObuf = (Byte*)calloc(_MAX_ZMG_BUFFER, sizeof(Byte));

memset(&alObuf, 0x00sizeof(alObuf));
因为自从知道上面的数组memset的写法以后,就一直习惯在前面加个&。然而,这一次,栽了。。
仔细看,这只是个unsigned char指针,加上了&就完全不知道指哪儿去了。。。

所以,这个写法,只能用在数组前,千万别用在指针前。。。另外,这里的sizeof(alObuf)也只是4而已,指针的sizeof。。。数组和指针,别搞混了。
posted on 2010-03-18 19:35 RayRiver 阅读(458) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理