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

运行该C语言字符串操作代码是否会输出两次harishshima?

结论

你的预期不符合这段代码的实际运行逻辑,这段代码存在明确的内存越界问题,属于C语言标准定义的未定义行为,无法稳定输出两次harishshima,甚至可能直接触发运行时崩溃。

核心问题拆解
  • 首先是s1的内存空间不足:你用char s1[]=" harish";定义数组时,编译器只会给s1分配刚好能存下初始字符串的内存——算上开头的空格、harish的6个字符、末尾自动补充的字符串结束符\0,s1的总长度仅为8字节,没有预留任何多余空间存放待拼接的内容。
  • strcat的行为逻辑和你预期有偏差:该函数会直接修改第一个入参指向的内存,从目标字符串的\0位置开始,把源字符串的所有内容(含末尾的\0)拷贝覆盖到对应位置,不会自动检查目标缓冲区的剩余空间是否足够。
  • 代码逐行运行的实际走向:
    1. 第一次调用strcat(s1,s2)时,需要把总长6字节的"shima"(5个字母+1个\0)写入s1的合法内存边界之外,已经构成栈内存越界写入,直接触发未定义行为——可能覆盖栈上其他变量的值、破坏函数栈帧结构,程序随时可能崩溃退出。
    2. 就算第一次越界写入侥幸没有崩溃,执行完第一次拼接后s1存储的内容已经变成" harishshima",原始的字符串结束符位置已经被字母s覆盖。第二次调用strcat(s1,s2)时,会从当前s1新的结束符位置(已经在s1原本的内存范围外)再往后追加一次"shima",根本得不到你想要的拼接结果。
    3. 哪怕你提前给s1分配足够大的空间(比如定义为char s1[100] = " harish";),第二次拼接也会在第一次拼接完成的长字符串基础上再追加一次"shima",最终s3里存储的会是" harishshimashima",依旧不会输出两次相同的harishshima。
符合预期的修正写法

如果要实现两次输出 harishshima的效果,需要提前给s1分配足够的缓冲区,并且在第二次拼接前把s1重置为初始内容,参考代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char s3[100];
    char s1[100] = " harish"; // 预留足够的拼接空间
    char s2[] = "shima";
    puts(strcat(s1, s2));
    // 重置s1为初始内容后再做第二次拼接
    strcpy(s1, " harish");
    strcpy(s3, strcat(s1, s2));
    puts(s3);
    return 0;
}

内容的提问来源于stack exchange,提问作者Tanya shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:39:09