在最后一次调用 strcpy() 之后, char* s2 究竟如何以及为什么会发生变化?

How and why exactly does char* s2 change after the last strcpy() call?

这是我几天后在学校进行的考试中可能会出现的问题之一。我无法理解 char* s2 在最后一次 strcpy() 调用后如何从 "Message Service" 变为 "ice"。我认为这是指针的某种结果,但我只知道这些。

char s1[] = "Short Message Service";
char *s2, *s3;

s2 = strchr(s1, 'M');

s3 = strrchr(s2, 'S');

strncpy(s1 + 1, s2, 1);

strcpy(s1 + 2, s3);  

我尝试调试程序并观察变量和指针的变化,但我仍然不明白最后一次调用是如何影响 char *s2 的。

我预计 s2 的值为 "Message Service",但实际输出结果为 "ice"。不过,我确实理解 s1 和 s3 如何以及为什么会发生变化。

如果我们显示数组,并添加相应的指针,它将看起来像这样:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'h' | 'o' | 'r' | 't' | ' ' | 'M' | 'e' | 's' | 's' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '[=20=]' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^                                   ^                                               ^
|                                   |                                               |
s1                                 s2                                               s3

当您修改数组的内容时,指针 s2s3 本身并没有改变,它们仍然指向数组中的相同位置。

之后

strncpy(s1 + 1, s2, 1);

数组(带指针)看起来像

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'M' | 'o' | 'r' | 't' | ' ' | 'M' | 'e' | 's' | 's' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '[=21=]' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^                                   ^                                               ^
|                                   |                                               |
s1                                 s2                                               s3

s2指向的单个字符被复制到s1[1]

然后用

strcpy(s1 + 2, s3);  

数组看起来像

+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
| 'S' | 'M' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '[=22=]' | 'a' | 'g' | 'e' | ' ' | 'S' | 'e' | 'r' | 'v' | 'i' | 'c' | 'e' | '[=22=]' |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+
^                                   ^                                                ^
|                                   |                                                |
s1                                 s2                                                s3

sub-string "Service" 复制了从 s1[2] 开始的部分字符串。

指针 s2 仍然指向相同的位置,但是如果我们将 s2 视为指向字符串第一个字符的指针,那么它的内容已经改变,因为您已经覆盖了该内容.