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(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)。
for(int i 0; i < 100; i++)
a[i] = 20;
int a[100];
std::fill(std::begin(a), std::end(a), 20); // 全部填充为 20
或者
std::fill_n(a, 100, 20); // 填充前 100 个元素为 20
#include <array>
#include <algorithm>
std::array<int, 100> a;
a.fill(20); // 全部填充为 20
或者
std::fill(a.begin(), a.end(), 20);