2

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

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 个字符位置。

希望我说得通。如果没有请编辑。:)

4

4 回答 4

5

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

(第二个版本也是未定义的行为,因为您超出了数组t1。)

于 2012-10-28T18:45:05.133 回答
0

调用的目标数组strcat必须是可修改的内存并且足够大以保存结果。

char *t1 = "Hi Hello";   // non-modifiable memory
char t2[16] = " strcat"; // large enough for result, including terminating '\0'
strcat(t2, t1);          // okay

假设我数对了...

于 2012-10-28T18:49:38.387 回答
0

实际上 strcat() 函数将源字符串附加到目标字符串之后。第二个参数应该是源字符串。每当您运行第一个示例时,您都试图在 t2 字符串之后添加 t1 字符串。但是 t2 字符串的大小是固定的,因为它只是一个固定大小的数组(即大小不能增加)

于 2012-10-28T18:49:42.963 回答
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两个琴弦都没有足够的空间。

于 2012-10-28T18:47:35.797 回答