C语言中这样使用memset()是否正确?向void*缓冲区首4字节写入整数
问题修正与解答
int类型大小说明
你认为int占4字节的结论符合绝大多数主流桌面、移动端平台的实际情况,但C语言标准本身没有规定int的固定长度,仅要求它的长度至少为2字节,实际大小由编译器和目标硬件架构决定,比如部分8位/16位嵌入式平台的int长度就是2字节。
你的代码存在的问题
你写的memset(buffer, '9', sizeof(int))无法实现写入整数的需求:
- memset函数的作用是逐字节填充固定值,它的第二个参数会被转换为unsigned char类型,然后重复填充到目标内存的每个字节中。你传入的是字符'9',对应的ASCII码是十进制57,执行完代码后buffer前4个字节的每个字节值都是0x39(即十进制57),最终这4字节拼接出的int值为0x39393939(十进制959989817),和你预期的整数值完全不同。
正确实现方式
- 如果你要写入指定整数值(比如整数值9),直接对强转后的指针赋值即可:
*(int *)buffer = 9;
- 如果你确实需要将前4个字节逐字节填充为同一个固定值(比如全填0、全填0xff),才适合用memset,例如填充全0的写法是:
memset(buffer, 0, sizeof(int));
注意事项
操作前需要确保buffer指向的可写内存空间至少有sizeof(int)字节,避免越界访问触发崩溃。如果该缓冲区用于跨平台数据传输,还需要额外考虑大小端字节序兼容问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

