可能重复:
What is the difference between char s[] and char *s in C?
int main()
{
char *t1 = "Hi hello";
char t2[] = " strcat";
printf("%s", strcat(t1, t2));
}
当我运行此程序时,它会给我分段错误
int main()
{
char t1[] = "Hi hello";
char *t2 = " strcat";
printf("%s", strcat(t1, t2));
}
然而,当我运行下一个程序时,它正常运行并显示连接的字符串。 为什么会这样?
这个问题非常封闭。只是想添加摘要。我理解的要点是: 对于以这种方式声明的变量
char *t1 = "hi hello";
确保添加类型限定符const。因为默认情况下它是只读存储器。不惜任何代价,我们无法修改数据。例如
t1[0] = "L";
是不允许的。以这种方式声明的变量不受我们控制,并且在程序的生命周期内将永久保留。我们甚至无法释放那段记忆。
char t1[10] = "hi hello";
这样我们可以更好地控制内存。我们被允许修改数组。只要范围消失,分配的内存就会被释放。
char t1[] = "hi hello"; char t2[8] = "hi hello";
两个声明t1和t2非常相同,顺序分配了8个字符位置。
希望我有道理。如果没有请编辑。 :)
答案 0 :(得分:5)
t1
是指向只读字符序列的指针。 strcat
希望写到第一个参数指向的数组中,这是未定义的行为。
(第二个版本也是未定义的行为,因为你正在超越数组t1
。)
答案 1 :(得分:0)
两个程序都是错误的,但是第二个程序可以改进,你需要在目标数组中有更多空间用于下一个序列:
char t1[100] = "Hi hello"; // at least 16 is needed for t1 + t2 - 100 is just example
char *t2 = " strcat";
您之前的定义:
char t1[] = "Hi hello";
相当于:
char t1[9] = "Hi hello";
或:
char t1[9] = {'H','i',' ','h','e','l','l','o','\0'};
9
对于你的两个字符串都没有足够的空间。
答案 2 :(得分:0)
对strcat
的调用的目标数组必须是可修改的内存,并且大到足以保存结果。
char *t1 = "Hi Hello"; // non-modifiable memory
char t2[16] = " strcat"; // large enough for result, including terminating '\0'
strcat(t2, t1); // okay
假设我算得对...
答案 3 :(得分:0)
实际上strcat()函数会在目标字符串后附加源字符串。第二个参数应该是源字符串。无论何时运行第一个样本,您都试图在t2字符串后添加t1字符串。但是t2字符串的大小是固定的,因为它只是一个固定大小的数组(即大小不能增加)