[C语言] 内存函数介绍与模拟实现
Table of Contents

内存函数 Link to 内存函数

1.memcpy Link to 1. memcpy

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

作用: strcpy 是用来拷贝字符串的, memcpy 也可以逐字节拷贝其他类型的数据(C语言要求其处理内存空间地址不重叠的数据)(PS: VS中 已经将其优化得可以处理内存空间地址重叠的数据)

模拟实现memcpy

C
1
2
3
4
5
6
7
8
9
10
11
12
void* myMemcpy(void* dest, const void* src, size_t num) {
    void* ret = dest;
    assert(dest && src);
    
    while(num--) {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;	//上边强制类型转换解引用后, dest 的类型依旧是 void*, 无法直接加加, 所以依旧需要强制类型转换
        src = (char*)src + 1;
    }
    
    return ret; //有返回类型, 必须返回一个值(可忽略此返回值)
}

2.memmove Link to 2. memmove

C
1
void * memmove ( void * destination, const void * source, size_t num );

作用: 同memcpy一样, memmove 也可以逐字节拷贝其他类型的数据(C语言要求其处理内存空间地址重叠的数据)

模拟实现memmove

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void* myMemmove(void* dest, const void* src, size_t num) {
    void* ret = dest;
    assert(dest && src);
    
    if(dest < src) {
    	// 从前向后拷贝
        while(num--) {
        	*(char*)dest = *(char*)src;
        	dest = (char*)dest + 1;	//上边强制类型转换解引用后, dest 的类型依旧是 void*, 无法直接加加, 所以依旧需要强制类型转换
        	src = (char*)src + 1;
    	}
    }
    else {
        // 从后向前拷贝
        while(num--)
        	*((char*)dest+num) = *((char*)src+num);
    }
    
    return ret; //有返回类型, 必须返回一个值(可忽略此返回值)
}

3. memcmp Link to 3. memcmp

C
1
int myMemcmp ( const void * ptr1, const void * ptr2, size_t num )

作用: strcmp 是用来比较字符串的, memcmp 也可以逐字节比较其他类型的数据

4. memset Link to 4. memset

C
1
2
void *myMemset( void *dest, int c, size_t num) {
}

作用: 将数组前 num 字节, 每个字节赋值为 c


Thanks for reading!

[C语言] 内存函数介绍与模拟实现

Wed Feb 16 2022
532 字 · 4 分钟