strcpy 函数详解:作用、用法与安全缺陷

发布时间:2026/10/29 15:46:44

strcpy 函数详解:作用、用法与安全缺陷 1. 什么是 strcpy 函数strcpy 是 C 语言标准库string.h中提供的字符串复制函数其函数原型如下char *strcpy(char *dest, const char *src);该函数的作用是将源字符串 src包括结尾的空字符\0复制到目标缓冲区 dest 中并返回 dest 的指针。它是 C 语言中最基础、最常用的字符串操作函数之一在 C 中同样可以通过cstring头文件使用。2. strcpy 的基本用法下面通过一个简单的 C 语言示例演示 strcpy 的基本用法#include stdio.h #include string.h int main() { char src[] Hello, World!; char dest[20]; strcpy(dest, src); printf(复制结果: %s\n, dest); return 0; }程序运行后dest 数组中的内容变为 Hello, World!输出结果如下复制结果: Hello, World!在 C 中使用方式与 C 语言基本一致只需引入cstring头文件#include iostream #include cstring int main() { char src[] Hello, C!; char dest[20]; strcpy(dest, src); std::cout 复制结果: dest std::endl; return 0; }3. strcpy 的返回值strcpy 返回目标字符串 dest 的指针。这个返回值允许函数调用进行链式操作例如#include stdio.h #include string.h int main() { char dest[50]; char src1[] Hello, ; char src2[] World!; // 链式调用先复制 src1再拼接 src2 strcat(strcpy(dest, src1), src2); printf(最终结果: %s\n, dest); return 0; }上述代码先将 src1 复制到 dest然后紧接着将 src2 拼接到 dest 末尾最终输出最终结果: Hello, World!4. strcpy 的致命缺陷缓冲区溢出strcpy 最大的缺陷是不检查目标缓冲区的大小。它只根据源字符串的\0结束符判断复制何时停止如果源字符串的长度超过目标缓冲区容量就会发生缓冲区溢出覆盖相邻内存区域的数据。下面是一个典型的溢出示例#include stdio.h #include string.h int main() { char dest[5]; char src[] This is a very long string!; // 危险操作src 长度远超 dest 容量 strcpy(dest, src); printf(dest: %s\n, dest); return 0; }dest 数组只有 5 个字节而 src 的长度远超 5 个字节。strcpy 会一直复制直到遇到 src 的结束符导致 dest 后面的内存被越界写入。这种未定义行为可能造成以下后果程序崩溃覆盖了关键数据或返回地址导致段错误。数据损坏相邻变量的值被意外修改产生难以排查的逻辑错误。安全漏洞攻击者可以利用缓冲区溢出注入恶意代码这是许多经典安全漏洞的根源。5. 缓冲区溢出的实际危害缓冲区溢出不仅是程序健壮性问题更是严重的安全隐患。攻击者可以通过精心构造的输入数据覆盖函数返回地址或函数指针从而劫持程序执行流程执行任意代码。历史上著名的 Morris 蠕虫、Code Red 蠕虫等安全事件都与缓冲区溢出漏洞密切相关。下面演示一个缓冲区溢出导致相邻数据被破坏的例子#include stdio.h #include string.h int main() { int secret 100; char buffer[8]; char src[] Overflow!; printf(溢出前 secret %d\n, secret); strcpy(buffer, src); printf(溢出后 secret %d\n, secret); return 0; }由于 src 的长度含结束符共 10 字节超过了 buffer 的容量8 字节多余的数据会写入相邻内存可能覆盖 secret 变量的值导致程序行为异常。6. 安全的替代方案为了避免缓冲区溢出C 语言标准库提供了更安全的替代函数推荐在开发中优先使用。6.1 strncpy 函数strncpy 允许指定最大复制长度从源字符串复制最多 n 个字符到目标缓冲区char *strncpy(char *dest, const char *src, size_t n);使用示例#include stdio.h #include string.h int main() { char dest[10]; char src[] This is a very long string!; // 最多复制 9 个字符并手动添加结束符 strncpy(dest, src, sizeof(dest) - 1); dest[sizeof(dest) - 1] \0; printf(截断结果: %s\n, dest); return 0; }需要注意的是strncpy 在源字符串长度小于 n 时会用空字符填充剩余空间当源字符串长度大于等于 n 时不会自动添加结束符因此需要手动设置dest[n-1] \0。6.2 strcpy_s 函数在 C11 标准中提供了更安全的 strcpy_s 函数它显式接收目标缓冲区大小并在空间不足时返回错误errno_t strcpy_s(char *dest, rsize_t destsz, const char *src);使用示例#include stdio.h #include string.h int main() { char dest[10]; char src[] This is a very long string!; if (strcpy_s(dest, sizeof(dest), src) ! 0) { printf(复制失败目标缓冲区空间不足\n); } else { printf(复制成功: %s\n, dest); } return 0; }strcpy_s 在检测到空间不足时会返回非零错误码并可能触发约束处理函数避免缓冲区溢出。6.3 C 中的 std::string在 C 开发中更推荐直接使用标准库的 std::string 类它自动管理内存从根本上避免了缓冲区溢出问题#include iostream #include string int main() { std::string src This is a very long string!; std::string dest src; // 自动分配足够内存 std::cout 复制结果: dest std::endl; return 0; }7. 总结strcpy 是 C 语言中经典的字符串复制函数使用简单、性能高效但其不检查目标缓冲区大小的设计缺陷使其成为缓冲区溢出漏洞的高发源头。在实际开发中应遵循以下建议C 语言开发优先使用 strncpy 或 strcpy_s并始终确保目标缓冲区足够大。C 开发优先使用 std::string避免直接操作裸字符数组。代码审查对涉及字符串复制的代码进行严格审查确保所有复制操作都有边界检查。编译防护开启编译器的安全选项如 GCC 的-fstack-protector增加运行时防护。理解 strcpy 的原理和缺陷不仅有助于编写更安全的代码也能帮助开发者深入理解 C/C 内存管理的底层机制。
延伸阅读

更多相关文章

2026/10/30 5:01:39

Claude Code v2.1.246更新:Bash权限、全屏与会话修复指南

Claude Code 是 Anthropic 出品的终端 AI 编程助手,运行在命令行环境里,能够读取项目代码、分析报错、修改文件,并且直接执行 shell 命令。正因为它的执行权限足够强,Bash 命令的授权策略、终端渲染状态和会话恢复机制&#xff0c…

2026/10/29 19:40:42

3.2 C++实战100例——函数参数求值顺序:C++17 前未指定

3.2 C++实战100例——函数参数求值顺序:C++17 前未指定 一句话方向 —— 用汇编对照 C++14 与 C++17 标准差异,证明同一表达式在不同标准下的实际参数入栈顺序变化,并给出 -Wsequence-point 无法覆盖时的 Clang 诊断命令 总纲和5篇免费文章分流 C++ 踩坑排雷手册 总纲目…

2026/10/29 17:28:13

2026年英语听说AI软件怎么选?避开这3个坑

【引言】现在市面上的英语听说AI工具不少,但真拿去给学生用,问题就冒出来了:评分不准、反馈太虚、数据安全没保障。这篇文章会用三年多的落地经验,把选型时最容易踩的3个坑拆开讲清楚,再聊聊一个相对靠谱的技术判断思路…

2026/10/30 12:33:52

Ani 动漫资源聚合拆解:多数据源检索的完整管线

Ani 动漫资源聚合拆解:多数据源检索的完整管线 【免费下载链接】animation-garden 集找番、追番、看番的一站式弹幕追番平台,云收藏同步 (Bangumi),离线缓存,BitTorrent,弹幕云过滤。100% Kotlin/Compose Multiplatfor…

2026/10/30 12:33:52

《AI Agent原理与实战》2026版 第28课 计算机操作 Agent(CUA)

> 本文收录于专栏 《AI Agent原理与实战》2026版 —— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战,点击订阅可跟踪后续更新。 本课定位:API 之外的最后一块交互疆土:让 Agent 直接操作计算机。屏幕观察-决策-行动循环、与 API 工具调…

2026/10/30 12:33:52

STM32(F429)启动模式与两种烧录方式

前言STM32 所有启动逻辑、烧录逻辑的核心根源只有一个:芯片每次上电、硬件复位瞬间,会采样 BOOT0、BOOT1 硬件引脚电平,决定本次开机从哪个内存区域执行代码。 新手最容易混淆的三个问题:为什么有三种启动模式?分别干什…

2026/10/30 12:33:52

路灯杆灯箱标识牌哪家靠谱

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 12:33:51

《AI Agent原理与实战》2026版 第29课 Agent 安全

本文收录于专栏 《AI Agent原理与实战》2026版 —— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战,点击订阅可跟踪后续更新。 本课定位:阶段 5 收官:Agent 安全。攻击面总览、提示词注入为何无银弹、最小权限模型、密码学回执审计&#x…

2026/10/30 12:28:51

网络质量监控选型:CentOS 7安装Smokeping全记录

简介:这是一份面向网络运维工程师、系统管理员及开发者的 CentOS 7 下 Smokeping 快速部署手册。资源以 yum 安装方式为主线,先说明需要启用 EPEL 源,再依次讲解 /etc/smokeping/config 中监控主机、探测器与图表等配置,以及通过 …

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑