【发布时间】:2018-12-18 00:11:01
【问题描述】:
我不确定为什么 strcat 在这种情况下对我有用:
char* foo="foo";
printf(strcat(foo,"bar"));
它为我成功打印了“foobar”。
但是,根据之前在 stackoverflow 上讨论的主题:I just can't figure out strcat
它说,上面不应该工作,因为 foo 被声明为字符串文字。相反,它需要声明为缓冲区(一个预定大小的数组,以便它可以容纳我们试图连接的另一个字符串)。
那么,为什么上面的程序能成功地为我工作?
【问题讨论】:
-
不保证失败。
-
字符串文字是不可变的。你不能修改它。任何修改字符串文字的尝试都可能导致程序的未定义行为。当有 UB 时,您可以获得预期或任何意想不到的结果。
-
出于好奇,您使用的是什么编译器/平台?较旧的编译器通常只是将字符串文字留在可写内存中(这 符合 标准,尽管是一个陷阱,因为修改它们仍然会导致“有趣”的结果),这可以解释这种行为。这同样适用于没有内存保护的平台上的当前编译器。
-
即使
foo是可写的,它也不能被连接到。考虑尝试连接到char foo[] = "foo";。与char foo[42] = "foo";不同,没有可用内存。 -
@WeatherVane 阅读了这个问题。他正在链接到另一个问题,而这正是讨论的主题。所以这不是这个问题的主题。