c ++中指针的行为

时间:2012-10-28 18:42:22

标签: c++ c pointers

  

可能重复:
  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个字符位置。

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

4 个答案:

答案 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字符串的大小是固定的,因为它只是一个固定大小的数组(即大小不能增加)