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

问题描述 投票:-3回答:2
char temp1[4] = "abc";
char *temp2 = "123";
strcpy(temp1,temp2);

如果我想将一个字符串文字复制到一个数组,它运行良好,但如果我以相反的方式做,我得到一个错误:

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

编译器的反馈是“Segmentation fault”。

那有什么不同呢?无论如何将字符串复制到字符串文字?

谢谢。

c
2个回答
2
投票

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

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

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

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


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. */

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

© www.soinside.com 2019 - 2024. All rights reserved.