模拟实现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() 按字节填充,因此对于非字符类型(如 intfloat、结构体等),只能安全地将其设置为全 0 或全 1(即 0x000xFF),其他值可能不会得到期望的结果。

模拟实现

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;
}
相关推荐
2501_933923253 小时前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
wuyk5554 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
船厂电气自动化ai大模型4 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
phltxy4 小时前
C语言结构体
c语言
库玛西4 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
2601_955518184 小时前
如何学好C语言:从入门到精通,掌握编程基石
c语言·指针·项目实战·调试技巧·编程基础
高级程序源4 小时前
django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计
后端·python·mysql·小程序·django·flask·课程设计
伊信4 小时前
Spring AI 基础学习与应用
java·后端
是隼人4 小时前
buuctf-pwn ciscn_2019_sw_1(32位只有一次格式化机会)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门