«
memset的内部实现及缺陷

时间:2025-4-13    作者:范文泉    分类: 编程


memset 的具体实现的代码大概如下:

//实现方式是逐字节写入
void* memset(void* dest, int ch, size_t count) {
    unsigned char* p = (unsigned char*)dest;
    while (count--) {
        *p++ = (unsigned char)ch;
    }
    return dest;
}

memset 的注意事项

仅适用于字节级填充

memset 是按字节填充的,所以:
memset(a, 0, sizeof(a)) ✅(0 的字节模式是 0x00)
memset(a, -1, sizeof(a)) ✅(-1 的字节模式是 0xFF)
memset(a, 20, sizeof(a)) ❌(20 的字节模式是 0x14,但 int 可能是 0x14141414,不符合预期)

不能用于初始化非平凡类型(如类对象)

memset 会破坏 C++ 对象的内部结构(如虚表指针),导致未定义行为(UB)。

对于需要初始化某个值的数组可以用如下方法:

1、使用循环对每个变量初始

for(int i 0; i < 100; i++)
    a[i] = 20;

2、使用 std::fill 或 std::fill_n(需要包含

int a[100];
std::fill(std::begin(a), std::end(a), 20); // 全部填充为 20
或者
std::fill_n(a, 100, 20); // 填充前 100 个元素为 20

3、使用 std::array(推荐,更现代的方式)

#include <array>
#include <algorithm>

std::array<int, 100> a;
a.fill(20); // 全部填充为 20
或者
std::fill(a.begin(), a.end(), 20);