
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)); // 算法里初始化数组为 -13. 最大区别对比strcpymemset作用复制字符串填充内存处理对象字符串任意内存是否关心\0关心遇到\0停止不关心按字节数量填第三个参数没有填多少个字节常见用途把hello拷贝进数组清零、初始化数组4. 对比例子很关键strcpychar arr[20]; strcpy(arr, abc);结果类似arr: a b c \0 ? ? ? ? ...它只复制abc和最后的\0。memsetchar 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)); // 不建议结果不是每个元素为 1strcpystring copy字符串复制 memsetmemory set内存设置更直观一点strcpy(arr, hello);意思是把 hello 这个字符串放进 arrmemset(arr, 0, sizeof(arr));意思是把 arr 这块内存全部刷成 0最常用搭配就是char arr[100]; memset(arr, 0, sizeof(arr)); // 先清空 strcpy(arr, hello); // 再放字符串