You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:12:04