理解字符串和数组

Shu*_*hya 3 c arrays string pointers

考虑这段代码.

int main()
{
    char *s, *t;

    s = malloc(4 * sizeof(char));
    strcpy(s, "foo");
    t = s;
    printf("%s %s\n", s, t);         // Output --> foo foo
    strcpy(s, "bar"); // s = "bar"
    printf("%s %s\n", s, t);         // Output --> bar bar
}
Run Code Online (Sandbox Code Playgroud)

有两个字符串st.首先,我设置s"foo",然后做ts.当我打印字符串时,我明白了foo foo.

然后,复制"bar"s和重新打印,我得到bar bar.

为什么t这种情况下的变化值?(我复制"bar"s为什么t改变了).


现在当我strcpy(s, "bar")改为s = "bar"-

int main()
{
    char *s, *t;

    s = malloc(4 * sizeof(char));
    strcpy(s, "foo");
    t = s;
    printf("%s %s\n", s, t); // Output --> foo foo
    s = "bar"
    printf("%s %s\n", s, t); // Output --> bar foo
}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我foo foobar foo.

在这种情况下为什么不改变?

hmj*_*mjd 12

这是未定义的行为,这意味着任何事情都可能发生:

char *s, *t;
strcpy(s, "foo");
Run Code Online (Sandbox Code Playgroud)

就像strcpy()写入内存中的随机位置一样,因为它s是一个未初始化的指针.


(编辑后修正了未定义的行为)

问题1 - 为什么在这种情况下t的值会发生变化?(我复制了"bar"为什么没有改变).

这是一个指针赋值:

t = s;
Run Code Online (Sandbox Code Playgroud)

并导致两者ts指向malloc()与之前分配的相同内存s.通过t和,可以看到对该内存的任何更改s.

问题2 - 为什么在第二种情况下不改变?

这会将字符串文字的地址指定"bar"s:

s = "bar";
Run Code Online (Sandbox Code Playgroud)

所以现在ts没有指向相同的内存位置.t指向先前malloc()分配给的内存s(由于t = s;指针赋值).

strcpy()并且=非常不同的:

  • strcpy() 将字符复制到其第一个参数指定的内存地址
  • 赋值,=更改指针所包含的地址