C语言安全编码之数值中的sizeof操作符
通常来说获取数组的长度时不要对指针应用sizeof操作符。
现来看看下面这段代码:
voidclear(intarray[]){ for(size_ti=0;i<sizeof(array)/sizeof(array[0]);i++){ array[i]=0; } } voiddowork(void){ intdis[12]; clear(dis); /*...*/ }
clear()使用sizeof(array)/sizeof(array[0])这种用法确定这个数组的元素数量,但由于array是一个形参,因此它是指针类型,sizeof(array)=sizeof(int*)=4 (32位OS)
当sizeof操作符应用于声明为数组或函数类型的形参时,它会产生经过调整的(指针)类型的长度
对此问题的解决方案如下:
voidclear(intarray[],size_tlen){ for(size_ti=0;i<len;i++){ array[i]=0; } } voiddowork(void){ intdis[12]; clear(dis,sizeof(dis)/sizeof(dis[0])); /*...*/ }