1.memcpy函数
void * memcpy ( void * destination, const void * source, size_t num );
用途:各种数据类型,从源数组拷贝num个字节到指定目标空间里面。
要点:
(1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
(2)这个函数在遇到 ‘\0’ 的时候并不会停下来。
(3)如果source和destination有任何的重叠,复制的结果都是未定义的。
运用实例
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person, sizeof(person) );
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
return 0;
}
可以看见,memcpy函数即可以拷贝字符串,还可以拷贝整型的数据。
模拟实现memcpy函数
void* memcpy(void* destination, const void* source, size_t num)
{
void* ret = destination;
assert(destination && source);
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return ret;
}
2.memmove函数
void * memmove ( void * destination, const void * source, size_t num );
用途:各种数据类型,从源数组拷贝num个字节到指定目标空间里面。可以防止覆盖时候出现的问题。
要点:
(1)和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
(2)如果源空间和目标空间出现重叠,就得使用memmove函数处理。
实例:
/* memmove example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
模拟实现memmove函数
void* memmove(void* destination, const void* source, size_t num)
{
assert(destination && source);
void* ret = destination;
if (destination > source)
{
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
}
else
{
while (num--)
{
*((char*)destination + num) = *((char*)source + num);
}
}
return ret;
}
3. memcmp函数
用途:比较各种类型的数组的字节
要点:
4. memset函数
void *memset( void *dest, int c, size_t count );
要点:
memset - 内存设置函数
以字节为单位来设置内存中的数据的
参数解释:
dest 是目标空间的首地址;c是要改变的数据;count是要改变多少个字节。
运用实例:
int main()
{
//char arr[] = "hello world";
//memset(arr, 'x', 5);
//printf("%s\n", arr);
//memset(arr+6, 'y', 5);
//printf("%s\n", arr);
int arr[10] = { 0 };
memset(arr, 0, 40);
return 0;
}