You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

strcpy()函数输出异常原因及字符数组长度修复方案咨询

C语言字符串交换问题解答

问题1:strcpy()工作原理及输出异常原因

strcpy()工作原理

strcpy()是C标准库的字符串复制函数,它会从源字符串的起始地址开始,逐个字节复制内容到目标地址,直到遇到字符串结束符'\0'时停止,并且会将这个'\0'也复制到目标数组中,确保目标是合法的C字符串。

输出异常的原因

你的代码中:

char x[] = "water";
char y[] = "soda";

编译器会根据字符串字面量的长度自动分配数组大小:x的大小是6(5个字符加末尾的'\0'),y的大小是5(4个字符加'\0')。

执行流程中:

  1. strcpy(temp, x):temp存入完整的"water\0",无问题;
  2. strcpy(x, y):y的内容"soda\0"长度为5,x的6字节空间足够容纳,无问题;
  3. strcpy(y, temp):temp中的"water\0"需要6字节存储空间,但y只有5字节。strcpy()不会检查目标数组容量,会强行写入6字节,触发内存越界写入。

由于栈上局部变量的内存布局特性,y越界写入的第6字节刚好覆盖了x数组的起始位置,将x的第一个字节改为'\0'。printf输出字符串时遇到'\0'就会停止,因此x输出为空。

问题2:指定数组最大长度修复问题的原理

将char x[] = "water"改为char x[15] = "water"时,编译器会为x分配15字节的连续内存空间,而非自动计算的6字节。同理给y指定足够大的长度后,y的内存空间也会足够容纳要复制的字符串。

核心原理是:让目标数组的存储空间,大于等于源字符串的总长度(包含'\0')。strcpy()复制时需要足够空间存放所有字符和结束符,指定足够大的数组长度后,就不会出现内存越界写入的情况,避免了越界覆盖其他变量内存的问题,从而得到正确的交换结果。

内容的提问来源于stack exchange,提问作者Raman Bhardwaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:42:56