实现memcpy和memmove函数

题目:

自己定义一个函数,实现my_memcpy和my_memmove函数。

题目分析:

memcpy函数主要实现的是内存的拷贝,函数接受任意类型的参数,并且有拷贝个数的限制,函数与strcpy函数在功能上有相似点,也有不同点。memmove函数在memcpy函数的基础上解决了内存重叠的问题。下面是memcpy和memmove函数的实现:

my_memmove函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
//实现内存拷贝函数
void *my_memcpy(void *p1, const void *p2, size_t count)
    //count为内存的大小(所拷贝的字节数)
{
    assert(p1);
    assert(p2);
    char *dst = (char *)p1;   //将p1、p2强制类型转换为字符指针类型
    char *str = (char *)p2;
    while (count--)
   {
       *dst++ = *str++;
   }
   return p1;
}
 
int main()
{
    char dst[10] = {0};
    char str[] = "abcdef";
    my_memcpy(dst, str, 4);
    printf("%s\n", dst);
    system("pause");
    return 0;
}

my_memmove函数:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
//实现内存移动
void *my_memmove(void *p1, const void *p2, size_t count)
{
    assert(p1);
    assert(p2);
    char *dst = (char *)p1;
    char *str = (char *)p2;
    if (*dst > *str && *dst < *(str + count))
    {   
        while (count--)         //从前往后拷贝
       {   
           *(dst + count) = *(str + count);
       }
    }
   else
   {    
       while (count--)            //从后向前拷贝
       {
           *dst++ = *str++;
        }
    }
    return dst;
}
 
int main()
{
    char dst[10] = "abcdefg";
    char str[] = "def";
    my_memmove(dst, str, 2);
    printf("%s\n", dst);
    system("pause");
    return 0;
}
时间: 2024-10-27 02:29:39

实现memcpy和memmove函数的相关文章

C语言模拟实现memcpy,memmove函数

这里memcpy与memmove函数的模拟实现,需要用到空指针来传递参数,之后强制类型转换为char型,用size_t这个宏接受偏移量进行偏移,模拟实现如下: memcpy函数: void* my_memcpy(void*dst,const void*src ,size_t count) { assert(dst); assert(src); void* ret = dst; while (count--) { *(char*)dst = *(char*)src; dst = (char*)ds

memcpy函数 和 memmove函数 原码

原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: // memcpy.c #include <syslib.h> #include <string.h> main() { char *s=&

memcpy、memmove、memset及strcpy函数实现和理解

memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h>, 在C++中需要包含的头文件是#include其函数原型如下: void *memcpy(void *dest, const void *src, size_t n); 其功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 库函数中的memcpy不能处理sr

memcpy,memmove,memset函数福彩3D平台搭建用法及实现

一.函数介绍:福彩3D平台搭建论坛:haozbbs.com Q14465950671.memcpy函数原型:extern void memcpy(void dest, const void *src, size_t count);用法:#include<string.h>功能:由src所指内存区域复制count个字节到dest所指内存区域.说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.注意:和strcpy相比,memcpy不是遇到'/0'就结束,而是一定会拷贝完n个字

C语言memcpy()函数和memmove()函数

C语言memcpy()函数和memmove()函数 关于 memcpy() 函数,请先看链接. memcpy() 函数和 memmove() 函数的函数原型如下: void* memcpy(void * restrict s1, const void * restrict s2, size_t n); void* memmove(void * s1, const void * s2, size_t n); 两函数作用相似,都是指针 s2 指向的区域拷贝 n 个字节至 s1 指向的区域,并且都返回

memcpy与memmove

函数原型: void* memcpy(void *dst,void const *src,size_t count) void* memmove(void *dst,void const *src,size_t count) 头文件: #include<string.h> 引入: 字符串由'\0'结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容.但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据.所

memcpy 与 memmove

memcpy:C和C++当中使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型 void* memcpy(void* dest, const void* src, size_t count) 函数返回指向dest的指针: mencpy与memmove的区别:根据源代码编写自己的Mencpy 与Memmove #include <iostream> using namespace std; #incl

C语言实现memcpy和memmove

0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被更改.但是当目标区域与源区域没有重叠则和memcpy函数功能相同. memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:char s[] = "1234567890";char* p1 = s;

memcpy、memmove、memset、memchr、memcmp、strstr详解

第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,memset用于缓冲区的填充工作,memchr用于字符的查找工作,memcmp用于比较内存中缓冲区的大小. 第二部分  介绍 1.memcpy和memmove memcpy()--拷贝内存内容 表头文件:#include<string.h>或#include<cstring> 定义函数: