C语言获取整型数组字节数:对int用sizeof还是对数组用sizeof?
// Buffer size #define BUFSIZE (32) // The buffer int buf[BUFSIZE]; // Clearing the buffer: // 1st way memset(buf, 0, BUFSIZE*sizeof(int)); // or // 2nd way memset(buf, 0, sizeof(buf));
结论
你给出的示例场景下两种写法都正确,运行效果没有任何差异,但二者的容错性和适用场景有明显区别。
二者的差异说明
- 计算逻辑的区别
- 第一种写法是先取数组元素总个数
BUFSIZE,乘以单个int类型的字节数,显式算出整个数组的总字节数,逻辑完全符合memset的参数要求。 - 第二种写法利用了C语言sizeof的特性:对当前作用域内定义的固定长度数组名取sizeof,会直接返回整个数组占用的总字节数,数值上和
BUFSIZE * sizeof(int)完全相等,所以这个场景下也完全正确。
- 第一种写法是先取数组元素总个数
- 容错性区别
第一种写法和数组元素类型强绑定:如果后续修改buf的元素类型,比如把int buf[BUFSIZE]改成char buf[BUFSIZE],必须同步把sizeof(int)改成sizeof(char),否则会出现内存操作长度错误;而第二种写法sizeof(buf)不需要做任何修改,会自动适配新的数组总长度,出错概率更低。 - 适用场景区别
如果buf是作为函数参数传入的数组、或者是malloc动态分配的内存指针,数组名会退化为普通指针,sizeof(buf)得到的只是指针本身的字节数(32位系统4字节、64位系统8字节),不是整个内存块的总长度,这时候第二种写法会直接出错,只能用第一种显式计算总长度的方式。
使用建议
如果是当前作用域内定义的固定长度数组,优先用sizeof(数组名)的写法,更简洁也更易维护;如果是处理函数入参数组、动态分配的内存,就需要显式计算总字节数传入memset。
内容的提问来源于stack exchange,提问作者Danijel
相关产品推荐
相关产品推荐

