目录
一. memspy - 内存拷贝1
1.函数介绍
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的
- 函数的两个参数都是void*类型的指针,因为不知道是什么类型的数据会进行拷贝,所以要可以接受任何类型的指针
2.模拟实现
//只要完成了不重叠的内存拷贝,就算完成了任务
void* my_memecpy(void* dest, const void* source, size_t num)
{
assert(dest && source);
void* ret = dest; //返回拷贝过后的空间
while (num--)
{
*(char*)dest = *(char*)source; //char是一个字节,指针转化为char* 一次访问一个字节
dest = (char*)dest + 1;
source = (char*)source + 1;
}
return ret;
}
二.memmove - 内存拷贝2
1.函数介绍
void * memmove ( void * destination, const void * source, size_t num );
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
例如:我们想要 a b c d 拷贝到 c d e f上面去 结果为 a b a b c d f g
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = { 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' };
memcpy(str + 2, str , 4);
return 0;
}
但是实际的结果为 a b a b a b f g, 因为要拷贝 c d 的时候已经被前面的 a b 覆盖了,所以与预期的值不符,所以遇到区间重叠的时候我们要使用memmove函数进行操作。
2.模拟实现
void* my_memmove(void* dest, void* source, size_t count)
{
void* ret = dest; //拷贝后返回
assert(source && dest);
if (dest < source)
{
//前->后
while (count--)
{
*(char*)dest = *(char*)source;
dest = (char*)dest + 1;
source = (char*)source + 1;
}
}
else
{
//后->前
while (count--)
{
*((char*)dest+count) = *((char*)source + count);
}
}
return ret;
}
三. memcmp -内存比较
int memcmp( const void *buf1, const void *buf2, size_t count );
memcmp函数是一个用于比较两个内存块大小的函数。它会比较从buf1和buf2指针开始的count个字节,当buf1大于buf2的时候返回一个大于0的数;当buf1等于buf2的时候返回0;当buf1小于buf2的时候返回一个小于0的数。
使用:
#include<stdio.h>
#include<string.h> );
int main()
{
int a[] = { 1, 2, 3, 4 };
int b[] = { 1, 2, 4, 5 };
int temp1 = memcmp(a, b, 8); // 0
int temp2 = memcmp(a, b, 9); // 负数
return 0;
}
vs编译器采用小端存储模式
四. memset - 内存设置
1.函数介绍
void *memset( void *dest, int c, size_t count );
memset函数可以将内存块的某一部分设置为特定的字符。第一个参数dest是开始设置内存的起始位置,第二个参数是要将内存设置成的字符,第三个参数是从起始位置开始需要设置的内存的字节数。
重点:
- memset函数设置内存的时候是一个字节一个字节地设置的。
-
实际内存块填装的是unsigned char类型的数据
2.模拟实现
void* my_memset(void* ptr, int val, size_t num)
{
assert(ptr);
for (int i = 0; i < num; ++i)
{
*((char*)ptr + i) = (char)val;
}
return ptr;
}