为何以下C语言代码的最终输出为"eU2"?
代码执行过程分析(最终输出"eU2"的原因)
我们一步步拆解代码的执行逻辑,重点关注内存中字符串的变化:
初始状态
char str1[] = "See the stone set in your eyes"; 初始化后,str1的关键索引内存布局:
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... |
|---|---|---|---|---|---|---|---|---|
| 字符 | S | e | e | 空格 | t | h | e | ... |
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关键索引内存变为:
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... |
|---|---|---|---|---|---|---|---|---|
| 字符 | S | e | \0 | 空格 | t | e | \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关键索引内存变为:
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
|---|---|---|---|---|---|---|---|---|---|---|
| 字符 | S | e | \0 | 空格 | t | e | U | 2 | \0 | ... |
最终输出
printf("%s\n", ptr); 中ptr指向str1[5]的'e',从这里开始的字符串是"eU2"(索引5为e、6为U、7为2、8为'\0'),因此最终输出eU2。
内容的提问来源于stack exchange,提问作者Or_Melamed
相关产品推荐
相关产品推荐

