memcpy
模拟实现memcpy
memmove
模拟实现memmove
memcmp
memset
由 source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间内。格式如下
void * memcpy ( void * destination, const void * source, size_t num );
1、函数返回一个指向desinationt的指针。搭配头文件#include
2、source和destination所指内存区域不能重叠
3、与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
4、strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度
5、如果目标数组destination本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址
拷贝结构体代码如下
#include
#include
struct {
char name[40];
int age;
} person, person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
memcpy(person.name, myname, strlen(myname) + 1);
person.age = 46;
memcpy(&person_copy, &person, sizeof(person));
printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
return 0;
}
结果如下
void* my_memcpy(void* dest, const void* src, size_t num)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(src && dest);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 5,6,7,8,9,10 };
my_memcpy(arr1+2, arr2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
关于强制转换为char*的意义图解
注意: 此处代码不可以用dest++和src++进行代替。原因是虽然上一句代码进行了数据转换,但是那只是临时转换,如果用dest++,那么一次跳过的就不是一个字节了,而是dest所对应的字节;而按照上述代码书写则一次只跳一个字节。
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。格式如下
void * memmove ( void * destination, const void * source, size_t num );
说明:
如果源空间和目标空间出现重叠,就得使用memmove函数处理
其他情况便可以从前向后进行复制
具体函数实现如下
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
void* my_memmove(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;
src = (char*)src + 1;
}
}
else
{
while (num--)//20
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1+2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
比较从 ptr1 和 ptr2 指针开始的 num 个字节 ,可以比较任意类型的数据,格式如下
int memcmp ( const void * ptr1, const void * ptr2, size_t num )
内存设置
把prt前num个字节的内容设置成想要的value值
eg:
arr[]="hello Henry"
memset(arr,'x',4)
arr[]="hxxxx Henry"