内存函数的内容和部分实现

简介: 内存函数的内容和部分实现

首先,我们之前学习过strcpy函数(字符拷贝函数),不过这个函数有缺陷;如果用这个strcpy函数去拷贝整形数组有两个问题:1.拷贝的类型不一样strcpy(char* ,const char*);2.字符拷贝函数遇到'\0'就停止了,如果数组中以小端存储(01 00 00 00),则拷贝到00就停止了。


memcpy函数:


memcpy函数是以拷贝内存块来实现的,无论什么类型的数据都能拷贝,在C语言的库函数中memcpy函数的定义如下:void * memcpy( void * dest,const void * src, size_t num(单位是字节))。memcpy函数应该用于拷贝不重叠的内存,而memmove函数可以处理内存重叠的情况。


为什么会想到强制类型转换为char* 类型?


是因为size_t num 的单位是字节,而char* 类型移动的距离也是一个字节。


接下来,让我们自己实现my_memcpy函数。

void* memcpy(void* dest, const void* src, size_t num){
     assert(dest && src);
     void* ret = dest;
     while(num--){
        *(char* )dest = *(char* )src;
        dest = (char* )dest + 1;
        src = (char* )src + 1;
     }
     return ret;
}

这个自写函数只能拷贝不重叠的部分,而库函数中的memcpy也能拷贝重叠的部分。


memmove函数


memmove函数可以处理内存重叠的情况,在实现my_memmove函数中的思路是:可以将源数据从前向后拷贝,或从后向前拷贝。如果源头地址大于目标地址,则从前向后拷贝;源头地址+num小于目标地址,则从后向前拷贝。

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;
             dest = (char* )dest + 1;
             src = (char* )src + 1;
        }
    }
    else{
        while(num--){
            *((char* )dest + num) = *((char* )src + num);
        }
    } 
    return ret;
}

memcmp函数


C语言中的库函数是:int memcmp(const void* ptr1,const void* ptr2,size_t num)。如果比较浮点型,要注意浮点型储存。


memset函数


C语言中的库函数是:void* memset(void* ptr,int value,size_t num)。将内存中的内容数字改成value。特点是以字节为单位设置内存。


相关文章
|
27天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
19天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
128 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
5月前
|
C语言
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
【C语言】:动态内存管理函数malloc,calloc,realloc和free的介绍的介绍
62 0
|
14天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
15 0
|
28天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0
|
30天前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
61 0
|
30天前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
60 0