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

