/*
memcpy 内存拷贝 负责两份独立空间数据的拷贝
void * memcpy ( void * destination, const void * source, size_t num )
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到'\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的
*/
#include
void* my_memcpy(void* desert, const void* source, int num)
{
assert(desert&&source);
int i = 1;
for (i = 0; i < num; i++)
{
*(((char*)desert) + i) = *(((char*)source) + i);
}
return desert;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9 };
int arr2[9] = { 0 };
my_memcpy(arr2,arr1,36);
float arr3[] = { 1.0,2.0,3.0,4.0,5.0 };
float arr4[5] = { 0 };
memcpy(arr4,arr3,20);
return 0;
}
/*
memmove负责重叠内存的拷贝
void * memmove ( void * destination, const void * source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
*/
#include
#include
void* my_memmove(void* d, const void* s, size_t num)
{
assert(d && s);
int i = 0;
if (s < d)
{
for (i = 0; i < num; i++)//倒着换
{
//char* a = (char*)d;
//char*b = (char*)s;
*(((char*)d) + num - 1 - i) = *(((char*)s) + num - 1 - i);
}
}
else//正着换
{
for (i = 0; i < num; i++)
{
*(((char*)d) +i) = *(((char*)s) + i);
}
}
return d;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
// 1 2 1 2 3 4 5 8 9 10
//
my_memmove(arr+2,arr,20);
//my_memmove(arr, arr+5, 20);
return 0;
}
/*
内存比较,比较两个内存中的数据相不同相同
int memcmp ( const void * ptr1,
const void * ptr2,
size_t num );
比较从ptr1和ptr2指针开始的num个字节
当ptr1大于ptr2,返回大于0 的数字,反之返回小于0的数字
相等时返回0
*/
int main()
{
int arr1[] = { 1,2,3 };
int arr2[] = { 1,4,3 };
int ret = memcmp(arr2, arr1, 4);//注意单位是字节
printf("%d\n", ret);
return 0;
}
/*
内存设置 memset
void *memset( void *dest, int c, size_t count );
dest 起始位置
c 要设置的值
count 需要设置的个数,count代表字节数byte,从低字节向高字节改
*/
int main()
{
char ch[] = "hello bit!";
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memset(ch, 'x', 5);
printf("%s\n", ch);
for (int i = 0; i < 10; i++)
{
memset(arr+i,1,1);//每个int类型第一个字节设置为1
memset((char*)(arr + i)+1, 0, 3);//剩下的三个字节设置为0
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}