与指针程序混淆(c编程)

Sam*_*l F 1 c pointers

在编译这个程序时,我会收到一个我从未想过的输出.当我审查这个程序时,我预计指针的结果仍然是"Hello,world!" 因为据我所知指针从来没有受到指针2.然而,我的输出显示,当指针打印包含指针2的字符串'Y你们!’.怎么会这样?谢谢!!

#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);
}
Run Code Online (Sandbox Code Playgroud)

产量

Hello, world!
llo, world!
Hey you guys!
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 7

你有一个单独的内存区域,即阵列str_a.

strcpy调用和分配给pointerpointer2在内存中看起来像这样:

+---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+
| H | e | l | l | o | , |   | w | o | r | l | d | ! | \n | \0 | (uninitialized data) |
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+----+----------------------+
^       ^
|       |
|       pointer2
|
pointer

变量pointer指向str_a[0]pointer2指向str_a[2].

当您作为目标调用strcpypointer2,您更改pointer2指向的内存,这pointer也是指向的同一个数组,只是更多的字符.

  • 噢,很好的展示.不能顶一点.<G> (2认同)