memcpy的使⽤和模拟实现

目录

一:memcpy的使⽤

memcpy的使⽤的代码

二:memcpy函数的模拟实现:

memcpy和strcpy的区别

用途:

安全性:

数据类型:

性能:

在字符串中的用法示例:

memcpy:

strcpy

一:memcpy的使⽤

这是memcpy在库里的定义,具体可在cplusplus.com查看

void * memcpy ( void * destination, const void * source, size_t num )

•num单位是字节,下面的模拟实现需要强制类型转换

•函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

• 这个函数在遇到 '\0' 的时候并不会停下来。

• 如果source和destination有任何的重叠,复制的结果都是未定义的。对于重叠的内存,交给memmove来处理。(下期会有)

memcpy的使⽤的代码

#include <stdio.h> 
#include <string.h>
int main()
{    
 int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };    
 int arr2[10] = { 0 };   
 memcpy(arr2, arr1, 20);    
 int i = 0;    
 for (i = 0; i < 10; i++)  
 {      
  printf("%d ", arr2[i]);//结果是1 2 3 4 5 6 7 8 9 10   
 }   
 return 0; 
}

二:memcpy函数的模拟实现:

(模拟实现)就要严格按照库里所规定的

void和void*的用法已经发布

#include<stdio.h>
#include<assert.h>
void * my_memcpy ( void * dst, const void * src, size_t count)
{   
 void * ret = dst;    
 assert(dst);    
 assert(src);    
 while (count--) 
 {            
 *(char *)dst = *(char *)src;//强制类型转换            
 dst = (char *)dst + 1;//强制类型转换           
 src = (char *)src + 1;//强制类型转换   
 }
 return(ret); 
}

int main()
{	
    int arr1[]={1,2,3,4,5,6,7};
    int arr2[10]={0};
    void*p=my_memcpy(arr2,arr1,20);
    for(int i=0;i<10;i++)
    {
    	printf("%d ",*((int*)p+i));//强制类型转换
	}
	return 0;
 } 

memcpy和strcpy的区别

C语言中memcpy和strcpy是两个常用的字符串和内存操作函数,但它们在用途和行为上有明显的区别。

memcpy和strcpy都可以用在字符串,memcpy和strncpy在字符串中的使用几乎完全等价。

用途:

memcpy:是一个通用的内存复制函数,它用于从源地址(source)开始拷贝n个字节到目标地址(destination)。源地址和目标地址可以是任何类型的内存区域,但必须确保目标内存区域有足够的空间来容纳源内存区域的内容。
strcpy:是一个专门用于复制字符串的函数,它从源字符串(source string)的起始位置开始,逐个字符地复制到目标字符串(destination string)中,直到遇到源字符串中的空字符(null character, '\0')为止。这意味着strcpy会自动处理字符串的终止符。

安全性:

memcpy:不检查目标内存区域是否足够大以容纳源内存区域的内容。如果目标内存区域小于源内存区域,那么memcpy将会导致缓冲区溢出(buffer overflow),这是一个严重的安全漏洞,可能导致程序崩溃或被恶意利用。
strcpy:同样存在缓冲区溢出的风险,尤其是当目标字符串数组的大小不足以容纳源字符串(包括终止符)时。然而,由于strcpy是专门为字符串设计的,所以它在某些情况下可能更容易被识别和避免这种风险(例如,使用更安全的替代品如strncpy)。

数据类型:

memcpy:可以复制任何类型的内存区域,包括字符串、整数、浮点数等。它只关心字节的数量和起始地址。
strcpy:只能用于复制字符串,即字符数组。

性能:

在大多数情况下,由于memcpy不需要检查空字符,所以它可能比strcpy稍微快一些。然而,这种差异通常很小,而且在许多现代编译器和优化器的优化下可能变得不明显。

在字符串中的用法示例:

memcpy:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr3[]="abcdef";
    char arr4[20];
    memcpy(arr4,arr3,4);
    printf("%s\n",arr4);//结果:abcd
}
    

strcpy:

#include<stdio.h>
int main()
{
    char arr5[]="abcdef";
    char arr6[20];
    strncpy(arr6,arr5,4);
    //strcpy(arr6,arr5);,不可以确切的复制字符串,只能全部复制进去
    printf("%s\n",arr6);//结果也是abcd

}


注意:在使用memcpy和strcpy时,都应该确保目标内存区域有足够的空间来容纳源内存区域的内容,以避免缓冲区溢出。在实际编程中,更推荐使用更安全的替代品,如strncpy和strncpy_s(如果编译器支持)。

相关推荐

  1. memcpy使模拟实现

    2024-05-25 21:36:55       15 阅读
  2. rpchttp区别,使场景

    2024-05-25 21:36:55       40 阅读
  3. rpchttp区别,使场景

    2024-05-25 21:36:55       12 阅读
  4. 【C语言笔记】memcpymemncpy函数异同点

    2024-05-25 21:36:55       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-25 21:36:55       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-25 21:36:55       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-25 21:36:55       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-25 21:36:55       18 阅读

热门阅读

  1. 通关!游戏设计之道Day14

    2024-05-25 21:36:55       13 阅读
  2. python 多线程处理图片

    2024-05-25 21:36:55       13 阅读
  3. unity 制作app实现底部导航栏和顶部状态栏

    2024-05-25 21:36:55       13 阅读
  4. 什么是js

    2024-05-25 21:36:55       10 阅读
  5. 怎么使Ajax设为同步和异步

    2024-05-25 21:36:55       8 阅读
  6. C:技术面试总结

    2024-05-25 21:36:55       10 阅读
  7. Android NDK系列(二)NativeActivity工作流程

    2024-05-25 21:36:55       12 阅读
  8. OSI七层模型和TCP/IP四层模型的区别

    2024-05-25 21:36:55       8 阅读