strcpy 是 C 语言标准库 string.h 里面的核心字符串复制函数,这个函数一共包含两个参数,第一个参数是目标字符数组首地址,第二个参数是源字符串首地址,函数运行逻辑就是把源字符串连同末尾的空字符一起完整拷贝到目标内存空间,直到遇到源字符串的 \0 就停止复制,这个函数最大的特点是不做长度校验,所以使用的时候非常容易出现缓冲区溢出,也是 C 语言入门重点掌握的危险函数,理解 strcpy 两个参数的类型含义内存走向,是后续掌握 strncpy memcpy 等同类内存操作函数的基础,很多初学者混淆参数顺序,把源和目标写反,直接造成程序崩溃或者内存数据被破坏。
函数原型
char strcpy char dest const char src
标准写法
char strcpy char dest const char src
正式原型
char strcpy char dest const char src
规范原型
char strcpy char dest const char src
strcpy 两个参数详细说明
| 参数名称 | 参数类型 | 含义 | 关键要点 |
|---|---|---|---|
| dest | char 指针 | 目标缓冲区首地址 | 接收复制内容的内存,必须提前分配好足够空间,空间大小必须大于等于源字符串总长度加 1,额外 1 字节用来存放结束符 \0 |
| src | const char 指针 | 源字符串首地址 | 被复制的原始字符串,加 const 修饰代表函数内部不会修改源字符串内容,源字符串必须以 \0 作为结尾 |
参数底层运行原理
strcpy 拿到两个参数之后,会从 src 指向的第一个字符开始,逐个字节复制到 dest 指向的内存,每复制一个字节,两个指针自动向后偏移一位,一直读取到 src 里面的 \0 字符,并且把这个 \0 也复制到 dest 缓冲区,复制全部完成之后,函数返回 dest 也就是目标缓冲区的起始地址。
这里重点要记住,strcpy 完全依赖源字符串末尾的 \0 作为终止标记,如果源字符串没有 \0,函数会一直向后读取内存,出现越界读取,这就是参数 src 最常见的隐患。
dest 参数要求这块内存必须是可写的,如果 dest 指向字符串常量,常量内存是只读属性,执行 strcpy 就会触发段错误,程序直接异常退出。
参数使用完整示例步骤
第一步 引入头文件,代码开头加入 include string.h,否则编译器识别不到 strcpy 函数。
第二步 定义目标字符数组,提前开辟足够内存,例如 char buf 32,这个就是传给 strcpy 的第一个参数 dest。
第三步 准备源字符串,例如 char src hello world,作为第二个参数 src 传入函数。
第四步 调用函数 strcpy buf src,buf 就是 dest,src 就是源字符串。
第五步 执行完成之后,buf 里面就完整复制了源字符串,并且自带末尾 \0。
参数常见错误清单
1 参数顺序写反,写成 strcpy src dest,源缓冲区被目标内容覆盖,数据错乱
2 dest 缓冲区空间太小,源字符串长度超过 dest 分配大小,缓冲区溢出,覆盖相邻变量内存
3 dest 指向只读字符串常量,传入 strcpy,触发段错误
4 src 没有结束符 \0,strcpy 持续越界读取内存
5 dest 是空指针 NULL,传入 strcpy 直接崩溃
strcpy 参数和同类函数参数对比
| 函数 | 参数数量 | 是否校验长度 | 是否复制 \0 |
|---|---|---|---|
| strcpy | 2 个参数 | 不校验 | 一定会复制末尾 \0 |
| strncpy | 3 个参数 | 第三个参数指定最大复制字节数 | 长度不足不一定补 \0 |
| memcpy | 3 个参数 | 第三个参数指定字节数 | 不会自动识别 \0,按字节拷贝 |
【常见问题】
问题 1 strcpy 第一个参数为什么不能传字符串常量
回答 1 strcpy 第一个参数 dest 是可写目标缓冲区,字符串常量存储在只读内存区,strcpy 会向这个参数指向内存写入数据,传入常量就会触发段错误,所以 strcpy 第一个参数必须是可写字符数组或者可写堆内存指针。
问题 2 strcpy 第二个参数为什么加上 const 修饰
回答 2 strcpy 第二个参数是源字符串 src,const 修饰这个参数是为了明确约定 strcpy 不会修改源字符串内容,保护原始数据,同时提升代码可读性,告诉调用者传入这个参数之后原字符串不会被改动。
问题 3 strcpy 参数传 NULL 会发生什么
回答 3 strcpy 两个参数任意一个是 NULL,也就是 dest 或者 src 为空指针,调用 strcpy 的时候会发生空指针解引用,程序直接崩溃,所以正式代码调用 strcpy 之前需要对两个参数做非空判断。
【免责申明】
本文基于 C 语言标准库 strcpy 公开规范编写,不同编译器和操作系统底层实现细节可能存在细微差异,代码示例仅用于学习参考,生产环境使用 strcpy 需要额外做好安全防护,避免缓冲区溢出风险。


