模拟实现memset()(C语言)

C 库函数 - memset()

描述

C 库函数 void *memset(void *str, int c, size_t n) 用于将一段内存区域设置为指定的值。

memset() 函数将指定的值 c 复制到 str 所指向的内存区域的前 n 个字节中,这可以用于将内存块清零或设置为特定值。

在一些情况下,需要快速初始化大块内存为零或者特定值,memset() 可以提供高效的实现。

在清空内存区域或者为内存区域赋值时,memset() 是一个常用的工具函数。

声明

c 复制代码
void *memset(void *str, int c, size_t n);

参数

  • str -- 指向要填充的内存区域的指针。
  • c -- 要设置的值,通常是一个无符号字符。
  • n -- 要被设置为该值的字节数。

返回值

该函数返回一个指向存储区 str 的指针。

注意事项

  • memset() 并不对指针 str 指向的内存区域做边界检查,因此使用时需要确保 str 指向的内存区域足够大,避免发生越界访问。
  • memset() 的第二个参数 c 通常是一个 int 类型的值,但实际上只使用了该值的低 8 位(即转换为 unsigned char)。这意味着在范围 0 到 255 之外的其他值可能会产生未定义的行为。
  • n 参数表示要设置的字节数,通常是通过 sizeof() 或其他手段计算得到的。
  • memset() 按字节填充,因此对于非字符类型(如 int、float、结构体等),只能安全地将其设置为全 0 或全 1(即 0x00 或 0xFF),其他值可能不会得到期望的结果。

模拟实现

c 复制代码
#include <assert.h>
#include <stddef.h>

void *my_memset(void *ptr, int value, size_t num)
{
    assert(ptr != NULL);

    void *ret = ptr;
    unsigned char *p = (unsigned char *)ptr;
    unsigned char byte = (unsigned char)value;

    while (num--)
    {
        *p++ = byte;
    }

    return ret;
}
相关推荐
夏幻灵3 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码3 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
苍何3 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
bkspiderx4 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用5 小时前
Spring基础使用
java·后端·spring
程序员老陆5 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光5 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
明月_清风5 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
码云数智-园园5 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
蜗牛互联网5 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端