memset与strcpy区别
2026/6/16 11:07:43 网站建设 项目流程

strcpy是“拷贝字符串”,memset是“按字节填充内存”。

strcpy:复制字符串

函数原型是:

char *strcpy(char *dest, const char *src);

作用:把src字符串复制到dest里面,包括最后的\0

例子:

#include <stdio.h> #include <string.h> int main() { char arr[20]; strcpy(arr, "hello"); printf("%s\n", arr); return 0; }

结果:

hello

这里arr里面实际存的是:

'h' 'e' 'l' 'l' 'o' '\0'

所以strcpy适合处理字符串

memset:把一块内存全部设置成某个字节

函数原型大概是:

void *memset(void *ptr, int value, size_t num);

作用:从ptr开始,把后面num个字节都设置成value

例子:

#include <stdio.h> #include <string.h> int main() { char arr[20]; memset(arr, 0, sizeof(arr)); return 0; }

这句的意思是:

memset(arr, 0, sizeof(arr));

arr这 20 个字节全部清零。

所以memset常用于:

memset(arr, 0, sizeof(arr)); // 清空字符数组 memset(buf, 0, sizeof(buf)); // 清空缓冲区 memset(dp, -1, sizeof(dp)); // 算法里初始化数组为 -1

3. 最大区别

对比

strcpy

memset

作用

复制字符串

填充内存

处理对象

字符串

任意内存

是否关心\0

关心,遇到\0停止

不关心,按字节数量填

第三个参数

没有

填多少个字节

常见用途

"hello"拷贝进数组

清零、初始化数组


4. 对比例子:很关键

strcpy

char arr[20]; strcpy(arr, "abc");

结果类似:

arr: a b c \0 ? ? ? ? ...

它只复制"abc"和最后的\0


memset

char arr[20]; memset(arr, 'A', sizeof(arr));

结果是:

arr: A A A A A A A A A A A A A A A A A A A A

它不管字符串结束符,只负责填 20 个字节。

如果你这时候:

printf("%s\n", arr);

可能出问题,因为里面没有\0,它不知道字符串在哪里结束。

memset(arr, 0, sizeof(arr))为什么常见?

因为字符数组清零之后,全是:

'\0' '\0' '\0' '\0' ...

这时候它天然就是一个空字符串。

char arr[20]; memset(arr, 0, sizeof(arr)); printf("%s\n", arr);

输出为空,不会乱跑。

memset是按字节填

这个要特别注意 ⚠️

int arr[10]; memset(arr, 1, sizeof(arr));

你可能以为每个 int 都变成1,但不是。

因为memset是按字节填充,把每一个字节都填成0x01

一个int通常 4 字节,所以每个 int 变成:

0x01010101

十进制是:

16843009

所以初始化int数组时:

memset(arr, 0, sizeof(arr)); // 可以 memset(arr, -1, sizeof(arr)); // 通常可以 memset(arr, 1, sizeof(arr)); // 不建议,结果不是每个元素为 1
strcpy:string copy,字符串复制 memset:memory set,内存设置

更直观一点:

strcpy(arr, "hello");

意思是:

把 hello 这个字符串放进 arr
memset(arr, 0, sizeof(arr));

意思是:

把 arr 这块内存全部刷成 0

最常用搭配就是:

char arr[100]; memset(arr, 0, sizeof(arr)); // 先清空 strcpy(arr, "hello"); // 再放字符串

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询