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

C语言字符串操作触发段错误:printf无法打印但puts可行的原因

代码段错误的原因分析

先看问题中的代码:

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

int main()
{
    char s1[]="harry ";
    char s2[]="is a friend of ";
    char s3[]="ravi";
    char s4[20];
    char s5[20];
    strcpy(s4,strcat(s1,s2));
    strcpy(s5,strcat(s4,s3));
    printf("%s", s5);
    return 0;
}

错误核心原因:缓冲区溢出触发未定义行为

  1. s1空间不足直接破坏栈内存
    char s1[]="harry "; 会自动创建长度为7的数组(包含字符串结束符\0),刚好容纳"harry "。调用strcat(s1, s2)时,strcat会把s2的内容追加到s1末尾,但s1没有多余空间存储s2的内容,这会直接越界写入栈上的其他内存区域,破坏函数返回地址、其他变量等关键数据,最终触发段错误。

  2. s4和s5空间同样不足
    拼接后的完整字符串是"harry is a friend of ravi",加上\0总长度为25,而s4和s5仅声明了20的空间,后续的strcat和strcpy同样会导致缓冲区溢出,进一步加剧内存破坏。

关于puts能输出的误区

这只是未定义行为的随机表现,不是puts修复了问题。缓冲区溢出后,程序行为完全不可预测,有时候可能刚好没破坏到puts执行所需的关键内存,所以能输出,但这只是偶然情况,代码本身的错误依然存在。

内容的提问来源于stack exchange,提问作者Riya agrwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:53:19