如何在C中复制到字符串文字

时间:2018-06-04 20:50:46

标签: c

char temp1[4] = "abc";
char *temp2 = "123";
strcpy(temp1,temp2);

如果我想将字符串文字复制到数组中,它运行良好,但如果我以相反的方式执行,我会收到错误:

char temp1[4] = "abc";
char *temp2 = "123";
strcpy(temp2,temp1);

来自编译器的反馈是"分段错误"。

那么差异是什么?无论如何将字符串复制到字符串文字?

THX。

2 个答案:

答案 0 :(得分:2)

您需要了解这两行之间的细微差别

char temp1[4] = "abc";
char *temp2 = "123";

第一个创建一个4字符变量并复制" abc \ 0"它 如果您愿意,可以覆盖它。你可以做到,例如temp1[0] = 'x'如果你愿意的话。

第二个创建一个指向常量字面值的指针" 123 \ 0"。
你不能覆盖它,它通常在内存中声明只读给操作系统。

答案 1 :(得分:1)

你所拥有的东西比字符串文字更复杂,你尝试做的事情不能被描述为"复制到字符串文字"。哪个好,因为复制到字符串文字实际上是不可能的。 (原谅双关语。)

首先,您在第一个代码引用中成功完成的操作是将字符串文字复制到大小为4的字符数组中(您知道)。但是,您正在通过指向该字符串文字(temp2)的指针进行复制的详细信息。另请注意,指针指向的不是可以以任何方式编辑的变量。它只是一个链接器知道的字符串"。

在第二个代码引用中,您尝试将一个字符串(严格来说是一个以零终止的字符序列存储在数组中,temp1,但不是字符串文字)复制到指向char(temp2)指向,但它不是一个合法写入的变量。

所涉及的变量的类型基本上允许这样的操作,但在这种情况下它是禁止/不可能的;这导致了分段错误。

现在可能和可能是您实际尝试的是将temp2重新指向temp1开头的地址。我相信这就是给你想要的效果:

char temp1[4] = "abc";
char *temp2 = "123";

/* Some code, in which temp2 is used with a meaningful
   initialisation value, which is represented by "123".
   Then, I assume you want to change the pointer, so that it points
   to a dynamically determined string, which is stored in a changeable
   variable.
   To do that: */
temp2=temp1;
/* But make sure to keep the variable, the name you chose makes me worry. */

请注意,数组标识符可用作指向数组条目类型的指针。