(博主纯纯小白(dasabi)一枚,如有错误还请指正😇)
目录:
1.重要性
2.函数形式、作用和模拟实现
一:内存操作函数的重要性
在C语言中,这四个内存操作函数具有极其重要的地位,它们是底层内存操作的基础工具,广泛应用于各种需要直接操作内存块的场景。
二:函数基本形式及作用
2.1 memcpy函数
2.1.1. 函数原型与功能介绍
void* memcpy(void *dest, const void *src, size_t num)
此函数将从 src 指向的内存区域连续复制 n 个字节的数据到 dest 指向的位置。需要注意的是,memcpy 不保证在源和目标区域重叠时的行为,如果两个区域存在重叠,则可能导致结果不可预测。
2.1.2 模拟实现
//模拟实现strncpy函数
#include<stdio.h>
#include<assert.h>
#include<string.h>
//这四个函数的头文件都是string.h
void *My_memcpy(void *dest, const void *src, size_t num)
{
void *ret = dest;
assert(dest);
assert(src);
int i = 0;
for (i = 0; i < num; i++)
{
*(char *) dest = *(char *) src;
dest = (char *) dest + 1;
src = (char *) src + 1;
}
return ret;
}
int main()
{
char dest[30] = "Hello!";
char src[30] = "World!";
printf("%s", memcpy(dest, src, 3));
return 0;
}
结果显示为:
2.2 memmove函数
2.2.1 函数原型与与memcpy的差异
void* memmove(void *dest, const void *src, size_t num)
memmove 函数在功能上类似于 memcpy ,但特别之处在于它能正确处理源和目标内存区域有重叠的情况:当源和目标区域部分或全部重叠时,memmove 会确保所有字节都被正确地复制,即使在拷贝过程中可能会覆盖尚未被复制的部分。
memmove之所以能实现内存空间有重叠的
2.2.2 模拟实现
//模拟实现memmove函数
#include<stdio.h>
#include<assert.h>
#include<string.h>
void *My_memmove(void *dest, const void *src, size_t num)
{
void *ret = dest;
assert(dest);
assert(src);
int i = 0, j = 0;
if (dest <= src || (char *) dest >= (char *) src + num)
{
for (i = 0; i < num; i++)
{
*(char *) dest = *(char *) src;
dest = (char *) dest + 1;
src = (char *) src + 1;
}
} else
{
dest = (char *) dest + num - 1;
src = (char *) src + num- 1;
for (j = 0; j < num; j++)
{
*(char *) dest = *(char *) src;
dest = (char *) dest - 1;
src = (char *) src - 1;
}
}
return ret;
}
int main()
{
char dest[30] = "Hello,18542764!";
char src[30] = "World!";
My_memmove(dest + 4, dest + 1, 3);
printf("%s", dest);
return 0;
}
结果显示为:
(“ell”替换“o,1”)
2.3 memset函数
2.3.1. 函数原型与功能说明
void* memset(void *str, int c, size_t num)
memset 函数用于将指定的内存区域初始化为特定的值:该函数将 value 所代表的字节值填充至 ptr 指向的内存区域,填充长度为 num 个字节。
2.3.2. 模拟实现
#include<stdio.h>
#include <assert.h>
void *my_memset(void *ptr, int value, size_t num)
{
assert(ptr != NULL);
char *ret = (char *) ptr;
for (int i = 0; i < num; i++)
{
*ret++ = (char) value;
}
return ptr; // 返回初始的ptr作为结果
}
int main()
{
char str[] = "Hello, world!";
my_memset(str, '0', 3);
printf("%s", str);
return 0;
}
打印结果为:
2.4 memcmp函数
2.4.1. 函数原型与功能介绍
int memcmp(const void *str1, const void *str2, size_t num)
memcmp 函数用于比较两个内存区域的内容:
它将返回一个整数值,表示从 ptr1 和 ptr2 开始的 num 个字节之间的差异。如果两个内存块完全相等,则返回0;如果 ptr1 指向的内容小于 ptr2 ,则返回负数;反之则返回正数。
2.4.2.模拟实现
#include<stdio.h>
#include <assert.h>
int my_memcmp(const void *ptr1, const void *ptr2, size_t num)
{
assert(ptr1 != NULL && ptr2 != NULL);
const char *p1 = (const char *) ptr1;
const char *p2 = (const char *) ptr2;
for (size_t i = 0; i < num; ++i)
{
if (*p1 != *p2)
{
return (*(char *) p1 - *(char *) p2);
}
p1++;
p2++;
}
return 0;
}
int main()
{
char str1[] = "Hello, world!";
char str2[] = "Hello, world!";
char str3[] = "Hello, word!";
int a=my_memcmp(str1, str2, 13);
int b=my_memcmp(str1, str3, 11);
printf("%d %d",a,b);
return 0;
}
结果显示为: