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

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

首先,我们之前学习过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。特点是以字节为单位设置内存。


相关文章
|
1月前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
32 0
|
2月前
|
编译器 C语言 C++
【C语言】realloc()函数详解(动态内存开辟函数)
【C语言】realloc()函数详解(动态内存开辟函数)
30 0
|
2月前
|
编译器 C语言 C++
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
56 2
|
2月前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
27 0
|
2月前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
45 0
|
15天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
18天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
24 0
|
1天前
|
存储 编译器 C语言
C语言:字符函数 & 字符串函数 & 内存函数
C语言:字符函数 & 字符串函数 & 内存函数
9 2
|
4天前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
12 0