自己实现的库函数(memset,memcmp,memcpy,memmove)

本文介绍了如何使用C语言实现四个关键的内存操作函数:memset(内存填充)、memcmp(内存比较)、memcpy(内存拷贝)及memmove(内存移动)。通过对这些函数的深入探讨和实践,读者可以更好地理解内存管理的基础知识。
 自己实现的库函数2(memset,memcmp,memcpy,memmove)
memset,memcmp,memcpy,memmove是对内存进行管理的库函数,为了更好的理解和使用这几个函数,自己用C语言实现一下~

//内存设置函数
void* my_memset(void* dest, int c, size_t count)
{
assert(dest != NULL);
char* pDest = (char*)dest;
while (count-->0)    //将内存中count个设置为c
{
*pDest++ = c;
}
return dest;
}
//内存比较函数
int my_memcmp(void* src1, void* src2, int len)
{
assert(src1 != NULL && src2 != NULL);
const char* pSrc1 = (char*)src1;
const char* pSrc2 = (char*)src2;
while (len-- > 0)
{
if (*pSrc1++ != *pSrc2++)   //当内存中的数据不相等时,可以比较出大小,否则两指针继续向后指
{
return *pSrc1 < *pSrc2 ? -1 : 1;
}
}
return 0;  //相等则返回0
}

要重点说一下内坤拷贝和内存移动函数。。。
memmove与memcpy都是将count个字节的源内存地址的内容拷贝到目标内存地址中,但当源内存和目的内存存在重叠时,memcpy会出现错误!memmove能正确拷贝,但也增加了一点点开销。
//内存拷贝函数
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (const char*)src;
while (count-- > 0)
{
*pDest++ = *pSrc++; //将pSrc指向的数据复制count个给pDest
}
return dest;
}
//内存移动函数
void* my_memmove(void* dest, void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (char*)src;
     if (pSrc >= pDest || pDest >= (pSrc + count))//当源内存地址在目的内存地址之后或者目的地址在源内存地址+count之后,可以正常拷贝
{


          while (count-- > 0)
{
*pDest++ = *pSrc;
}
}
else     //否则需要从后覆盖往前拷贝,防止出现覆盖
    {
while (count-- > 0)



{
*(pDest + count) = *(pSrc + count);
}
}
*pDest = '\0';
return dest;
<think>好的,我现在需要回答用户关于memset函数所属的C语言标准的问题。用户之前已经询问过如何使用memset将数组置零,现在他们想了解memset属于哪个库函数以及具体的头文件。 首先,我得确认用户的问题核心:memset属于哪个C标准,对应的头文件是什么。根据我的知识,memset在C语言中属于<string.h>头文件,但需要验证这一点是否正确。 用户提供的引用内容中提到了itoa函数,属于<stdlib.h>,但memset并不在<stdlib.h>里,而是在<string.h>。这点需要明确区分,避免混淆。用户可能被引用中的其他函数误导,所以需要明确指出memset的正确归属。 然后,我应该解释<string.h>的作用,说明这个头文件主要处理内存操作和字符串处理函数,比如memcpymemmove等,而memset是其中的内存设置函数。 接下来,需要给出示例代码,展示如何正确包含头文件和使用memset。这样用户可以直接看到实际应用,确保他们理解正确。 还要注意用户之前的问题中已经使用过memset,所以可能需要提醒他们回顾之前的示例,但这次明确头文件的部分。此外,用户可能对为什么<string.h>包含内存函数有疑问,可以简单解释历史原因或的组织结构。 最后,生成的相关问题需要围绕库函数、头文件的使用,以及与其他函数的比较,帮助用户进一步学习。比如,比较memset和其他初始化方法的区别,或者讨论<string.h>中的其他函数。 检查是否有遗漏点,例如是否提到C++中的情况(但用户明确问的是C语言),或者是否提到其他可能的头文件,比如<cstring>(但那是C++的版本)。确保回答准确针对C语言的<string.h>。 总结回答的结构:首先直接回答头文件是<string.h>,然后详细说明该头文件的内容,提供代码示例,注意事项,以及相关问题。确保内容清晰,结构合理,符合用户之前的问题格式。</think>### memset函数所属库函数说明 在C语言中,$memset$函数属于**标准库函数**中的**内存操作函数**,其定义位于 **`<string.h>`** 头文件中。该头文件主要包含以下两类函数: 1. **字符串处理函数**(如$strcpy$, $strlen$) 2. **内存操作函数**(如$memcpy$, $memset$, $memcmp$) --- ### 使用规范 #### 1. 头文件包含 ```c #include <string.h> // 必须包含该头文件才能调用memset ``` #### 2. 函数原型 ```c void *memset(void *ptr, int value, size_t num); ``` - **参数说明**: - $ptr$:目标内存地址 - $value$:设置的值(以字节为单位) - $num$:设置的字节数 --- ### 典型应用示例 ```c #include <stdio.h> #include <string.h> // 关键头文件 int main() { int arr[5]; memset(arr, 0, sizeof(arr)); // 将数组置为全0 char buffer[20]; memset(buffer, 'A', 10); // 前10字节填充字符'A' return 0; } ``` --- ### 注意事项 1. **值类型的限制**: - 若设置值非0或-1,可能导致数据类型错误(例如$int$数组设置1会得到每个字节为0x01,而非整数1)[^1] 2. **跨平台兼容性**: - `<string.h>`是C标准的一部分,支持所有符合C标准的编译器(如GCC、MSVC) 3. **与C++区别**: - C++中可使用`<cstring>`头文件,但函数命名空间不同(如`std::memset`) --- ### 与其他内存函数对比 | 函数 | 功能 | 适用场景 | |-----------|---------------------|--------------------| | $memset$ | 按字节填充内存块 | 初始化/重置内存 | | $memcpy$ | 复制内存块 | 数据拷贝 | | $memmove$ | 安全复制重叠内存块 | 缓冲区重叠时使用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值