题目

编写自定义函数实现简易内存按值填充 my_memset,按字节将指定内存区域全部设置为某个特定字节值。

输入格式:第一行输入数组长度 n;第二行输入用于填充的单字节整型数值 val。

输出格式:输出填充后的数组前 n 个元素的十六进制或整型数值。

数据范围与约定:1 ≤ n ≤ 100,填充值以单字节为单位。

思路与算法

1. 按字节写入特性
memset 并不是按元素填充,而是对每一个字节统一赋单字节值 (unsigned char)val。

2. 常见新手陷阱
若对 int a[10] 用 memset 赋 1,每个 int 会被填充为 0x01010101(即 16843009),而非整数 1。memset 最常用于赋 0 或 -1(全 1 补码)。

完整程序

#include <stdio.h>
#include <stddef.h>

// 实现 memset:将内存块前 n 个字节逐字节设置为指定的值
static void my_memset(void *p, int val, size_t n)
{
    unsigned char *q = p;
    while (n--) {
        *q++ = (unsigned char)val;
    }
}

int main(void)
{
    int a[5] = {1, 2, 3, 4, 5};
    // 常用场景:将数组整体字节清零
    my_memset(a, 0, sizeof a);
    for (int i = 0; i < 5; i++) {
        printf("%d%c", a[i], i + 1 < 5 ? ' ' : '\n');
    }
    return 0;
}

运行示例

输出:

0 0 0 0 0