0
点赞
收藏
分享

微信扫一扫

C语言—内存操作函数讲解及其模拟实现

头文件:string.h

一、memcpy()-内存拷贝

解释:将num字节的值从源指向的位置直接复制到目标指向的内存块。为避免溢出,目标和源参数指向的数组的大小至少应为num字节,并且不应重叠(对于重叠的内存块,memmove是一种更安全的方法)。

格式:

void * memcpy ( void * destination, const void * source, size_t num );

实例:

C语言—内存操作函数讲解及其模拟实现_内存操作

模拟实现:

void* my_memcpy(void* dest,const void* src,size_t num) {

void* ret = dest;
assert(dest && src);
//拷贝字节,一个一个字节的拷贝
while (num--) {
//强制转换为字节
*(char* )dest = *(char*) src;

//或者写成:
// *((char*)dest)++ ;
//*((char*)src)++;
dest = (char*)dest+1;
src = (char*)src + 1;
}
return ret;
}

要点:

1、memcpy函数应该拷贝不重叠的内存


二、memmove()-内存移动

解释:将num字节的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,允许目标和源重叠。

格式:

void* memmove(void* destination const void source size_t num)

实例:

C语言—内存操作函数讲解及其模拟实现_内存操作_02

模拟实现:

C语言—内存操作函数讲解及其模拟实现_C语言_03

void* my_memmove(void* dest,const void* src,size_t num) {

assert(dest && src);
void* ret = dest;
if(dest < src){
//前 -> 后
while (num--) {
(char*)dest = (char*)src;
*((char*)dest)++ = *((char*)src)++;

}
}
else {
//后 -> 前
while (num--) {
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}

要点:

1、memmove函数可以处理内存重叠的情况


三、memcmp()-内存比较

解释:将ptr1指向的内存块的前num字节与ptr2指向的前num个字节进行比较,如果它们都匹配返回零,如果不匹配则返回一个不同于零的值,表示哪个值更大

注意,与strcmp不同,该函数在找到空字符后不会停止比较。

格式:

void* memcmp(void* destination const void source size_t num)

实例:

C语言—内存操作函数讲解及其模拟实现_内存操作_04

要点:

1、memcmp()在不同条件下的返回值与strcmp()一致


四、memset()-内存设置

解释:将ptr指向的内存块的前num个字节设置为指定值(解释为无符号字符)。

格式:void * memset ( void * ptr, int value, size_t num );

实例:

C语言—内存操作函数讲解及其模拟实现_内存操作_05

要点:

1、以字节为单位设置内存


举报

相关推荐

0 条评论