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

为何以下C语言代码的最终输出为"eU2"?

代码执行过程分析(最终输出"eU2"的原因)

我们一步步拆解代码的执行逻辑,重点关注内存中字符串的变化:

初始状态

char str1[] = "See the stone set in your eyes"; 初始化后,str1的关键索引内存布局:

索引0123456...
字符See空格the...

char str2[] = "U2"; 内存为 U、2、\0。


步骤1:ptr指向str1[3]

ptr = &str1[3]; // 指向str1[3]的空格字符

此时ptr对应str1索引3,指向字符串 " the stone set in your eyes" 的开头空格。

步骤2:地址差计算(用户已理解,略过)

printf("%d\n", str1 - ptr); 输出-3,因为str1首地址比ptr低3个内存位置。

步骤3:截断str1为"Se"

ptr[-1] = 0; // ptr[-1]等价于*(ptr-1),即修改str1[2]为'\0'

这一步把str1[2]的'e'替换成字符串结束符'\0',str1从此被截断为 "Se"。

步骤4:调整ptr指向str1[5]

ptr = (++ptr)+1;
  • ++ptr 让ptr从索引3移动到索引4(指向't')
  • 再加1后,ptr指向索引5(原字符'h')
    此时printf("%s\n", ptr); 输出 "he stone set in your eyes",与用户注释一致。

步骤5:用"e"覆盖ptr指向的内容

strcpy(ptr, str1+1);

str1+1指向str1[1]的'e',此时str1从索引1开始的字符串是 "e"(因为索引2是'\0')。strcpy会把'e'复制到ptr指向的索引5位置,然后在索引6写入'\0'。此时str1关键索引内存变为:

索引0123456...
字符Se\0空格te\0...

步骤6:拼接str2到ptr-2指向的字符串

strcat(ptr-2, str2);

ptr-2指向str1[3]的空格字符。strcat会从该位置开始找到第一个'\0'(即索引6),然后把str2的"U2"拼接到后面:

  • 索引6写入'U',索引7写入'2',索引8写入'\0'
    此时str1关键索引内存变为:
索引012345678...
字符Se\0空格teU2\0...

最终输出

printf("%s\n", ptr); 中ptr指向str1[5]的'e',从这里开始的字符串是"eU2"(索引5为e、6为U、7为2、8为'\0'),因此最终输出eU2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:45:31