memcpy使用和模拟实现
memcpy使用
void * memcpy ( void * destination, const void * source, size_t num );
复制内存块
将 num 字节的值从源指向的位置直接复制到目标指向的内存块。
1.将num字节的值从源指向的位置直接复制到目标指向的内存块。
2.该函数不检查源代码中是否有任何终止 ‘\0’ 字符 - 它始终精确地复制 num 字节。
3.为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 字节,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)。
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 5 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
memcpy模拟实现
void* my_memcpy(void* dest, const void* sour, size_t num)
{
assert(dest && sour);
while (num--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 5 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
memmove使用和模拟实现
memmove使用
void * memmove ( void * destination, const void * source, size_t num);
1.将num字节的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。
2.源指针和目标指针所指向的对象的底层类型与此函数无关;结果是数据的二进制副本。
3.该函数不检查源中是否有任何终止null字符——它总是精确地复制num个字节。
4.为了避免溢出,目的参数和源参数所指向的数组的大小至少为num字节。
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 5 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
memmove模拟实现
当原指针(source)的地址小于目标指针(destination)时,如果
从前往后复制,arr[2],arr[2]复制到arr[4],arr[5],arr[4],arr[5]会被复制成3、4,即arr[4] = 3,arr[5] = 4,此时要复制arr[4],arr[5]到arr[7],arr[8],arr[4],arr[5]已经不再是5、6。
因此从前往后方法行不通,我们就采用从后往前的方法。
这样需要的数字就不会被覆盖掉。
同理可以推出
当原指针(source)的地址大于目标指针(destination)时,我们采用从前往后的方法。
void* my_memmove(void* dest, const void* sour, size_t num)
{
if (dest <= sour)
{
while (num--) {
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
}
else
{
while (num--) {
*((char*)dest + num) = *((char*)sour + num);
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr +2 , arr , 5*sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memset函数的使用
void * memset ( void * ptr, int value, size_t num );
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。
int main()
{
char str[] = "hello world!";
memset(str, 'x', 6);
printf(str);
return 0;
}
memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
#include <stdio.h>
#include <string.h>
int main ()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}