memcpy
函数介绍
函数声明:void * memcpy ( void * destination, const void * source, size_t num );
参数
目的地:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
源:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
数字:要复制的字节数。 size_t 是无符号整数类型。
头 文 件:#include <string.h>
返 回 值: 返回目的地。
函数memcpy从source的位置开始向后复制num个字节的数据到destinatation
** 为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 个字节,并且不应重叠(有任何的重叠,复制的结果都是未定义的,对于重叠的内存块,memmove 是一种更安全的方法)。 **
重叠示例
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
自定实现memcpy解决重叠问题
#include <stdio.h>
#include <string.h>
void* MyMemcpy(void* dest, const void* src, size_t size)
{
if (dest == NULL || src == NULL)
{
return NULL;
}
char* psrc = NULL;
char* pdest = NULL;
void* ret = dest;
// 判断dest和src是否重叠
if (dest > src && (char*)dest < (char*)src + size)
{
char* psrc = (char *)src + size - 1;
char* pdest = (char*)dest + size - 1;
while (size--)
{
*pdest-- = *psrc--;
}
}
else
{
psrc = (char *)src;
pdest = (char*)dest;
while (size--)
{
*pdest++ = *psrc++;
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10,0,0 };
MyMemcpy(arr1 + 2, arr1, 10*sizeof(int));
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
memmove
函数介绍
函数介绍
void *memmove(void str1, const void str2, size_t n)
参数
str1(dest) – 指向用于存储复制内容的目标数组,类型强制转换为 void 指针。
str2(src)-- 指向要复制的数据源,类型强制转换为 void 指针。
n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10,0,0 };
memmove(arr1 + 2, arr1, 10*sizeof(int));
for (int i = 0; i < sizeof(arr1) / sizeof(int); i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
strncpy、strcpy
函数介绍
char *strcpy(char *dest, const char *src);
参数
dest:目标字符串指针,
src :为源字符串指针。
strcpy() 把src所指的由’\0’结束的字符串复制到dest 所指的数组中,并且包括’\0’,返回指向 dest 字符串的起始地址。
注意:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "12345678";
char s1[9];
strcpy(s1, s);
printf("%s\n", s1);
return 0;
}
char * strncpy(char *dest, const char *src, size_t n);
参数
dest:目标字符串指针,
src: 源字符串指针
n: 复制长度
注意:n需要小于dest和src的长度,strncpy不会保证’\0’
不会保证"\0"
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "12345678";
char s1[9];
strncpy(s1, s, 7);
printf("%s\n", s1);
return 0;
}
strncpy和strcpy都不能用于重叠的情况