strcpy和memcpy区别?

V1.0 2024年5月28日 发布于博客园

区别

strcpy memcpy
数据类型 主要用于字符串复制,处理以 \0 结尾的字符串。 用于复制任意类型的数据,按字节复制。
终止符处理 会复制终止符 \0 不处理终止符,只复制指定数量的字节。
安全性 可能导致缓冲区溢出,因为它不检查目标缓冲区的大小。 需要确保目标缓冲区有足够的空间,但不会处理重叠的内存区域。
重叠内存 不涉及重叠内存的问题。 如果源和目标内存区域重叠,可能会导致未定义行为,应该使用 memmove

详细

strcpy()

strcpy

  • 头文件#include <string.h>
  • 原型char *strcpy(char *dest, const char *src);
  • 功能:将源字符串 src 复制到目标字符串 dest,包括终止的空字符 \0
  • 用途:用于复制以空字符 \0 结尾的C字符串。
  • 返回值:返回目标字符串 dest 的指针。
  • 注意事项:
    • 目标字符串 dest 必须有足够的空间来容纳源字符串 src,包括终止的空字符 \0
    • strcpy 不会检查目标缓冲区的大小,因此可能会导致缓冲区溢出(Buffer Overflow)的问题。

示例

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[20];  // 确保目标缓冲区足够大

    strcpy(dest, src);
    printf("Copied string: %s\n", dest);

    return 0;
}

memcpy()

  • 头文件#include <string.h>
  • 原型void *memcpy(void *dest, const void *src, size_t n);
  • 功能:将源内存区域 src 的前 n 个字节复制到目标内存区域 dest
  • 用途:用于复制任意类型的数据,包括但不限于字符串、结构体、数组等。
  • 返回值:返回目标内存区域 dest 的指针。
  • 注意事项:
    • memcpy 只会按字节复制数据,不会处理终止符 \0 或其他特殊字符。
    • 目标内存区域 dest 和源内存区域 src 必须不重叠。如果有重叠,应该使用 memmove
    • 目标内存区域 dest 必须有足够的空间来容纳 n 个字节的数据。

示例

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[20];  // 确保目标缓冲区足够大

    memcpy(dest, src, strlen(src) + 1);  // 包括终止的空字符
    printf("Copied string: %s\n", dest);

    return 0;
}
posted @ 2024-05-28 11:31  舟清颺  阅读(8)  评论(0编辑  收藏  举报