memcpy函数
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
函数原型:void* Memcpy(void* dest, const void* src, const rsize_t n)
因为是内存拷贝,所有接受的值也不知道是什么类型的,所以给出一个void*
类型来接收。
void的含义
void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。
注意
考虑赋值内存重叠的情况。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<assert.h>
using namespace std;
void* Memcpy(void* dest, const void* src, const rsize_t n)
{
/*if (NULL == dest || NULL == src)
return NULL;*/
// 使用assert需要包含头文件
assert(dest && src);
// 将数据强制类型转化为字符型
const char *pSrc = (const char*)src;
char *pDest = (char*)dest;
// 判断dest的位置,避免内存重叠
if (pDest > pSrc && pDest < pSrc + n)
{
// 以字符形式进行拷贝
// 从后向前拷贝
for (size_t i = n - 1; i >= 0; --i)
{
pDest[i] = pSrc[i];
}
}
else
{
// 从前向后拷贝
for (size_t i = 0; i < n; ++i)
{
pDest[i] = pSrc[i];
}
}
return pDest;
}
// String copy
char* Strcpy(char * dest, const char * src)
{
if (NULL == dest || NULL == src)
return NULL;
}
// 进行测试的主函数
int main()
{
char * a = "abcdefg";
char arr[7];
Memcpy(arr, a, 5);
for (int i = 0; i < 5; ++i)
cout << arr[i];
return 0;
}
strcpy函数
用于字符串的拷贝,会拷贝最后的'\0'
函数原型:char* my_strcpy(char* str1, const char* str2)
char* my_strcpy(char* str1, const char* str2)
{
char* ret = str1;
assert(str1 != NULL);
assert(src != NULL);
while ((*str1++ = *str2++) != '\0')
{
;
}
return ret;
}