我知道:
之间的区别char *a = "string";
char p[] = "string";
来自*a
,它充当以下内容......
+-----+ +---+---+---+---+---+---+---+
a: | *======> | s | t | r | i | n | g |\0 |
+-----+ +---+---+---+---+---+---+---+
如果我想创建另一个变量说
char *b;
我希望它将指针中的所有内容复制到一个点而不是指向a的内容。
+-----+ +---+---+---+---+---+---+---+
a: | *======> | s | t | r | i | n | g |\0 |
+-----+ +---+---+---+---+---+---+---+
b: | *======> | s | t | r | i | n | g |\0 |
+-----+ +---+---+---+---+---+---+---+
怎么做?
答案 0 :(得分:7)
在C中,您可以分配一个新的缓冲区b,然后使用标准库函数复制您的字符串,如下所示:
b = malloc((strlen(a) + 1) * sizeof(char));
strcpy(b,a);
请注意+1
中的malloc
,以便为终止'\0'
腾出空间。 sizeof(char)
是多余的,但我使用它来保持一致性。
在C ++中,您应该使用更安全,更优雅的std::string
:
std::string b {a};
答案 1 :(得分:6)
在C ++中,你可以做到
char *b = new char[strlen(a) + 1]{};
std::copy(a, a + strlen(a), b);
这是a live example。虽然,我建议使用std::string
来保证其安全性和易用性。
答案 2 :(得分:4)
a
的内容指向编译器设置的只读内存位置。如果你想在编译时让另一个具有不同的值,你必须自己定义一个:
char *a = "string";
char *b = "string"; // Nb. This might point to the same location as a
请注意,根据§2.14.5,这两个指针是否指向同一个内存位置实现已定义
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。
否则请转到堆存储位置,如:
size_t len = strlen(a); // Doesn't include null-terminator character
char *b = new char[len+1];
memcpy(b, a, len); // Assumes plain ASCII string
b[len] = '\0';
无论如何,我会选择std::string
。
答案 3 :(得分:1)
您可以使用strdup
中的非标准(但可在许多实现中使用)<string.h>
函数:
char *b;
strdup(b, a);
...
free(b);
或者您可以使用malloc
然后strcpy
预订空间:
char *b;
b = malloc(strlen(a) + 1);
strcpy(b, a);
...
free(b);
答案 4 :(得分:1)
a
的内容是您在图表中标记为*
的内容。 a
是您的小盒子,a
的内容就在盒子里!
“字符串”不是a
的内容。它位于内存中的其他位置,a
包含该字符串的地址。
将a
的内容复制到b
最终会这样做:
+-----+ +---+---+---+---+---+---+---+
a: | *======> | s | t | r | i | n | g |\0 |
+-----+ / +---+---+---+---+---+---+---+
b: | *====/
+-----+
要实现您在第二个图表中绘制的内容,您需要复制a
指向的所有数据。这不是直截了当的,因为你如何决定何时停止复制?没有一般的方法,但是如果您预先确定只想复制字符串,那么您可以使用复制字符串的函数。
常见但非标准的strdup
函数将分配新空间并复制字符串。否则,您可以分配空间(以C中分配空间的任何常用方式),然后将字符串复制到分配的空间。