在最后一次调用 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
当您修改数组的内容时,指针 s2
和 s3
本身并没有改变,它们仍然指向数组中的相同位置。
之后
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
视为指向字符串第一个字符的指针,那么它的内容已经改变,因为您已经覆盖了该内容.
这是我几天后在学校进行的考试中可能会出现的问题之一。我无法理解 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
当您修改数组的内容时,指针 s2
和 s3
本身并没有改变,它们仍然指向数组中的相同位置。
之后
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
视为指向字符串第一个字符的指针,那么它的内容已经改变,因为您已经覆盖了该内容.