今天看到同事写的代码:
char retcode[5];
memset( &retcode, 0x00, sizeof(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, 0x00, sizeof(alObuf));
因为自从知道上面的数组memset的写法以后,就一直习惯在前面加个&。然而,这一次,栽了。。
仔细看,这只是个unsigned char指针,加上了&就完全不知道指哪儿去了。。。
所以,这个写法,只能用在数组前,千万别用在指针前。。。另外,这里的sizeof(alObuf)也只是4而已,指针的sizeof。。。数组和指针,别搞混了。
posted on 2010-03-18 19:35
RayRiver 阅读(458)
评论(0) 编辑 收藏 引用 所属分类:
C/C++