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)
有两个字符串s和t.首先,我设置s到"foo",然后做t点s.当我打印字符串时,我明白了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 foo和bar 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)
并导致两者t并s指向malloc()与之前分配的相同内存s.通过t和,可以看到对该内存的任何更改s.
问题2 - 为什么在第二种情况下不改变?
这会将字符串文字的地址指定"bar"为s:
s = "bar";
Run Code Online (Sandbox Code Playgroud)
所以现在t并s没有指向相同的内存位置.t指向先前malloc()分配给的内存s(由于t = s;指针赋值).
strcpy()并且=是非常不同的:
strcpy() 将字符复制到其第一个参数指定的内存地址=更改指针所包含的地址| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |