strcpy、memcp、memset的区别

本文详细介绍了C语言中的字符串复制函数strcpy和通用内存复制函数memcpy的功能、实现方式及使用场景的区别。此外,还对比了这两种函数在复制内容、方法及用途上的不同。

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

strcpy和memcpy都是标准C库函数,它们有下面的特点。
一 strcpy()
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );
char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
  if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
  {

      return NULL;
  }
  char *strdest = dest; //保存目标字符串的首地址
  while ((*strDest++ = *strSrc++)!=’\0’); //把src字符串的内容复制到dest下
  return strdest;
}

二 memcpy()
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
  if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
  char tempFrom = (char )memFrom; //保存memFrom首地址
  char tempTo = (char )memTo; //保存memTo首地址
  while(size – > 0) //循环size次,复制memFrom的值到memTo中
  *tempTo++ = *tempFrom++ ;
  return memTo;
}
功能: 由memFrom所指内存区域复制size个字节到memTo所指内存区域。
说明: memTo和memFrom所指内存区域不能重叠,函数返回指向memTo的指针.可以拿它拷贝任何数据类型的对象。

char a[10],b[5];              
memcpy(b, a, sizeof(b));             /*注意如果用sizeof(a),会造成b的内存地址溢出*/

三、 memset()
extern void *memset(void *buffer, int c, int count);
功能: 把buffer所指内存区域的前count个字节设置成字符 c,主要用于初始化某个内存空间。
说明: 返回指向buffer的指针。用来对一段内存空间全部设置为某个字符
例如:

char a[10];                        
memset(a, '\0', sizeof(a));    

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

### 关于 `memcpy` 函数 在 C/C++ 中,`memcpy` 是一种用于复制内存块的标准库函数。它的定义位于头文件 `<cstring>` 或 `<string.h>` 中。以下是关于 `memcpy` 的详细介绍: #### 定义与功能 `memcpy` 的原型如下所示: ```c void* memcpy(void* dest, const void* src, size_t n); ``` 此函数的作用是从源地址 (`src`) 开始拷贝指定数量的字节到目标地址 (`dest`)。需要注意的是,`memcpy` 不会检查被复制的内容是否有意义或者是否超出边界,因此调用者需确保操作的安全性。 #### 参数说明 - **dest**: 指向要写入数据的目标位置的指针。 - **src**: 指向作为数据来源的位置的指针。 - **n**: 表示从 `src` 到 `dest` 将要复制的字节数。 #### 返回值 成功执行后返回指向目标区域首地址的指针即参数 `dest`[^1]。 #### 使用注意事项 当使用 `memcpy` 时应注意几个方面来避免潜在问题: - 确保目标缓冲区有足够的空间容纳来自源的数据加上可能存在的任何额外需求比如终止符等特殊处理情况; - 防止发生重叠区域间的自我赋值行为因为这可能导致不可预测的结果除非明确知道如何管理这种情形下的覆盖顺序;例如下面例子展示了不当使用的风险[^2]: ```c char buffer[50]; memset(buffer,'A',sizeof(buffer)); // 此处尝试将部分自己内容向前移动造成内部冲突 memcpy(&buffer[1],&buffer[3],strlen((const char*)buffer)-3); printf("%s\n",buffer); // 输出结果不确定取决于具体实现细节 ``` 另外值得注意的一点是尽管可以利用 `memcmp`, `strcpy`, `strncpy`, `sprintf` 等其他标准字符串/数组操作工具完成某些特定任务但它们各有优劣适用场景不同所以选择最合适的才是关键[^3]. ### 示例代码展示正确应用方式 这里给出一段简单的演示程序以显示如何安全有效地运用 `memcpy`: ```c #include <stdio.h> #include <string.h> int main() { char source[] = "Example String"; char destination[50]; printf("Before copy:\t%s\n",destination); /* Copy up to length of string including null terminator */ memcpy(destination,source,strlen(source)+1); printf("After copy:\t%s\n",destination); return 0; } ``` 上述代码片段清晰表明了通过计算原串的实际占用大小再加上结束标记位从而精确控制传输范围的重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值