编译这个程序时,我会收到一个我从未想过的输出。当我查看这个程序时,我预计指针的结果仍然是“Hello,world!”因为据我所知,指针从未受到 pointer2 的影响。然而,我的输出显示,当指针被打印时,它包含 pointer2 的字符串“你好!”。怎么会这样?谢谢!
#include <stdio.h>
#include <string.h>
int main() {
char str_a[20];
char *pointer;
char *pointer2;
strcpy(str_a, "Hello, world!\n");
pointer = str_a;
printf(pointer);
pointer2 = pointer + 2;
printf(pointer2);
strcpy(pointer2, "y you guys!\n");
printf(pointer);
}
输出
Hello, world!
llo, world!
Hey you guys!
答案 0 :(得分:7)
你有一个内存区域,即数组str_a
。
strcpy
来电后pointer
和pointer2
的分配在内存中看起来像这样:
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+ | H | e | l | l | o | , | | w | o | r | l | d | ! | \n | \0 | (uninitialized data) | +---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+ ^ ^ | | | pointer2 | pointer
变量pointer
指向str_a[0]
,pointer2
指向str_a[2]
。
当您使用strcpy
作为目标时调用pointer2
,您可以更改pointer2
指向的内存,这是pointer
指向的同一个数组,只是还有几个角色。