#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *hi = "bye";
char *bye = "abc";
strcat(hi, bye);
printf("%s\n", hi);
}
我如何连接这些变量?我尝试的所有东西都会崩溃
答案 0 :(得分:2)
你做不到。字符串文字是不可修改的。
如果您从中复制出可修改的副本,则可以。这里使用字符串文字的内容初始化char
数组。
char hi[10]="bye";
...
这会奏效。
在你的情况下,在字符串文字上使用strcat
,你正在调用未定义的行为。
来自6.4.5p7
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义。
同样来自标准
的J2: Undefined behavior列表程序尝试修改字符串文字
请注意,即使字符串文字是可修改的,它也不是连接字符串的已定义行为。连接字符串时确保连接的字符串有足够的空间 - 否则它会尝试写入char数组,而char数组本身将调用未定义的行为。根据我在本段中所说的内容(使用字符串文字的值初始化的char数组),您可以亲眼看到一件事,
char hi[]="bye";
然后使用strcat
会导致未定义的行为。
答案 1 :(得分:1)
字符串文字不可变。任何修改它的尝试都会调用未定义的行为。
如果将目标字符串存储在数组中,您将能够修改它:
int main()
{
char hi[10] = "bye";
char *bye = "abc";
strcat(hi, bye);
printf("%s\n", hi);
}
引用C标准草案N1570,第6.4.5 / 7节:
了解详情如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。