memcpy函数
函数原型
void *memcpy(void *dest, const void *src, size_t size);
功能:由src指向地址为起始地址的连续 size
个字节的数据复制到以dest指向地址为起始地址的内存空间内,函数返回值是 void *
,指向拷贝成功的内存地址;
注意:src
和dest
所指内存区域不能有重叠现象;
Demo:
char src[1024] = "Hello World";
//分配内存,同时注意处理'\0'的情况
char *dest = malloc(sizeof(char)*(strlen(src)+1));
memcpy(dest, src, sizeof(char)*(strlen(src)+1));
printf("%s\n",dest);
简单的实现方式:
void * mymemcpy(void *dest , const void *src , size_t size)
{
//非空校验
if (dest==NULL|| src == NULL) {
return NULL;
}
//判断内存区域是否有重叠现象
if (dest > (src+size) || dest < src)
{
//备份dest的首地址,让函数返回的指针是从头开始的
char *pdest = dest;
const char *psrc = src;
while (size-->0) {
*pdest++ = *psrc++;
}
return dest;
}
return NULL;
}
memmove函数
函数说明
void *memmove(void *dest, const void *source, size_t size)
函数说明: memmove
用于从source拷贝size个字符到dest,如果目标区域和源区域有重叠的话,memmove
能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
memcpy
函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy
; 如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove
。
![](https://img.haomeiwen.com/i1154433/6037e51b9b18d4f4.png)
简单的实现方式:
void * mymemmove(void *dest , const void *src , size_t size)
{
//非空校验
if (dest==NULL|| src == NULL) {
return NULL;
}
void *psrc = malloc(size);//分配内存
memcpy(psrc, src, size); //整体拷贝到临时内存中
memcpy(dest, psrc, size); //拷贝到目标内存中
free(psrc); //释放内存
return dest;
}
memset函数
函数原型
void *memset(void *dest,int val,size_t size)
功能:将已开辟的内存空间 dest
的前 size
个字节的值设为值 val
。
简单的实现方式:
void * mymemset(void *dest , int val , size_t size)
{
//非空校验
if (dest == NULL) {
return NULL;
}
char *pdest = dest;
while (size--) {
*pdest++ = val;
}
return dest;
}
memchr函数
函数原型
void *memchr(const void *buf, int ch, size_t count);
功能: 从buf所指内存区域的前count个字节查找字符ch,当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。
简单的实现方式:
void *mymemchr(const void *buf, int ch, size_t count)
{
char *p = NULL;
for (char *ps = buf; ps < (char *) buf + count; ps++) {
if (*ps == ch) {
p = ps;
break;
}
}
return p;
}
网友评论