为何sizeof(HEADER_SIZE)为4?明明初始化为44(CS50 Volume问题)
问题解析:
sizeof(HEADER_SIZE)的结果与代码错误原因 1. 为什么sizeof(HEADER_SIZE)返回4?
HEADER_SIZE是const int类型的常量,sizeof运算符的作用是获取变量/类型的字节大小,而非变量存储的值。在绝大多数现代操作系统和编译器环境中,int类型固定占用4字节内存空间,因此无论HEADER_SIZE的取值是44还是其他整数,sizeof(HEADER_SIZE)都会返回4。
2. 原代码出错的原因
结合你描述的现象(仅factor=1.0时输出文件正常,其他参数下损坏),以及用sizeof(header)修复问题的结果,核心问题出在WAV头部的写入环节:
- 假设你定义的
header是符合WAV标准的44字节数组/结构体,fread(header, HEADER_SIZE, 1, input)本身是正确的,能读取完整的44字节头部数据。 - 但如果在写入输出文件头部时,你错误地用
sizeof(HEADER_SIZE)代替了HEADER_SIZE,比如写成:
这会导致仅写入4字节的不完整头部,而非标准的44字节。fwrite(header, sizeof(HEADER_SIZE), 1, output);
为什么factor=1.0时看似正常?
当factor=1.0时,你只是直接复制原始音频数据到输出文件,此时文件结构为4字节不完整头部 + 完整原始音频数据。部分音频播放器容错性较强,会跳过不合法的头部信息,直接解析后续的音频数据,因此看起来播放正常。
而调整factor后,你修改了音频采样值,输出文件结构变为4字节不完整头部 + 修改后的音频数据,播放器既无法识别错误头部,也无法正确解析修改后的音频,最终导致文件损坏。
3. 修复方案的合理性
改用fread(header, sizeof(header), 1, input);和对应的fwrite(header, sizeof(header), 1, output);是更健壮的写法:
sizeof(header)直接获取存储WAV头部的变量(数组/结构体)的实际字节大小,无需依赖手动定义的HEADER_SIZE常量,从根源上避免了因常量定义错误或sizeof误用导致的字节数偏差。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

