c ++中指针的行为

Cha*_*nya 2 c c++ pointers

可能重复:
C中的char s []和char*s有什么区别?

int main()
{
    char *t1 = "Hi hello";
    char t2[] = " strcat";

    printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,它给了我分段错误

int main()
{
    char t1[] = "Hi hello";
    char *t2 = " strcat";

    printf("%s", strcat(t1, t2));
}
Run Code Online (Sandbox Code Playgroud)

而当我运行下一个程序时,它运行正常并显示连接的字符串.为什么会这样 ?

提前致谢 :)

本问题摘要[已解决]

这个问题非常封闭.只是想添加摘要.我理解的要点是:对于以这种方式声明的变量

char *t1 = "hi hello";  
Run Code Online (Sandbox Code Playgroud)

只需确保添加类型限定符const.因为默认情况下它是只读存储器.不惜任何代价,我们无法修改数据.例如

t1[0] = "L"; 
Run Code Online (Sandbox Code Playgroud)

是不被允许的.以这种方式声明的变量不受我们控制,并且在程序的生命周期内将永久保留.我们甚至无法释放那段记忆.

char t1[10] = "hi hello";
Run Code Online (Sandbox Code Playgroud)

这样我们就可以更好地控制内存.我们被允许修改数组.只要范围消失,分配的内存就会被释放.

char t1[] = "hi hello"; char t2[8] = "hi hello";
Run Code Online (Sandbox Code Playgroud)

两个声明t1和t2非常相同,顺序分配了8个字符位置.

希望我有道理.如果没有请编辑.:)

Ker*_* SB 5

t1是指向只读字符序列的指针.strcat想要写入第一个参数指向的数组,这是未定义的行为.

(第二个版本也是未定义的行为,因为您正在超越阵列t1.)