c语言strcpy、strncpy、memcpy内存拷贝比较

本文详细介绍了C语言中strcpy、strncpy与memcpy的区别。strcpy用于复制字符串,遇到''结束,可能导致缓冲区溢出;strncpy虽有限制复制字符数,但未正确填充可能导致安全问题;memcpy则可复制任意内容,常用于结构体,但超过源长度的内存区域可能不确定。在处理非字符串数据时,如十六进制流,memcpy更为合适。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strcpy、memcpy区别

strcpy和memcpy主要有以下3方面的区别。
  1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。企业中使用memcpy很平常,因为需要拷贝大量的结构体参数。memcpy通常与memset函数配合使用。
  2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。因此strcpy会默认复制字符串的结束符“\0”,而memcpy,当3个参数决定复制的长度包括了\0字符时,则也会复制\0,不包括\0字符的长度,则不会复制\0。
  3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

strcpy、strncpy的区别

strcpy()是依据源串的/0作为结束判断的,不检查目标空间Buffer的Size,如果目标空间不够,就有BufferOverflow问题。
strncpy(char* dst,char * src, size_t count),从源地址src拷贝count字符到目的地址dst,虽有count做限制,当strlen(src)>strlen(dst)时,还是会存在目标空间地址越界,所以使用strncpy的正确方法应该是,首先对dst空间用memset清零, strncpy(char dst,char * src, sizeof(dst)-1)。*

strncpy和memcpy的区别

如果只是操作字符串,其实这两个函数差别不大,类型转换都不是问题。
有一点差别就是当你要拷贝大于原字符串长度的时候,也就是 n 大于源字符串长度,strncpy 会用 ‘\0’ 来填充,而 memcpy 只完全复制源地址空间的字符,包括末尾的一个\0,再多余的字符不会出现用多个\0来填充,而是保持目的地址的已有的内存值,所以超过src长度的内存区域在目的地址内存中是不确定的。
嵌入式编程需要注意,比如串口里不传输字符串,而是传输十六进制比特流[^1]。
因为16进制流里难免出现0x00,如果用 strncpy 来拷贝数据,在出现0x00的地方就认为是字符串结束了,然后剩余的长度都会用0x00(‘\0’) 填充。而memcpy就不会出现这个问题。

数据流: a1 a2 a3 a4 a5 a6 a7 a8 a9 00 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9
用strncpy之后:a1 a2 a3 a4 a5 a6 a7 a8 a9 00 00 00 00 00 00 00 00 00 00 00
用memcpy之后:a1 a2 a3 a4 a5 a6 a7 a8 a9 00 b0 b1 b2 b3 b4 b5 b6 b7 b8 b

代码

/*********************************************************
参考:
https://blog.youkuaiyun.com/zhanghuan_wangkai/article/details/51674935

*  *******************************************************/
#include <stdio.h>
#include<string.h>
#include <assert.h>

void *my_memcpy(void *memTo, const void *memFrom, int size)
{
   
	//入口参数检查
	assert((memTo != NULL) && (memFrom != NULL));
	char *tempFrom = (char *)memFrom
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值