0

假设我有一个名为 string1 的 char 指针,它指向单词“hahahaha”中的第一个字符。我想创建一个 char[] 包含 string1 指向的相同字符串。

这怎么行不通?

char string2[] = string1;
4

4 回答 4

3

“这怎么行不通?”

因为那不是 C 语言的定义方式。

strdup()您可以使用[注意strdup()不是 ANSI C]创建副本

参考:

于 2013-08-24T01:13:29.307 回答
0

1) 指针字符串2 == 指针字符串1

任何一个值的变化都会改变另一个

从海报 poida

char string1[] = "hahahahaha";
char* string2 = string1;

2)制作副本

char string1[] = "hahahahaha";
char string2[11]; /* allocate sufficient memory plus null character */
strcpy(string2, string1);

其中一个的价值变化不会改变另一个

于 2013-08-24T01:22:58.483 回答
0

你这样写:

char str[] =  "hello";

...实际上变成了这样:

char str[] =  {'h', 'e', 'l', 'l', 'o'};

在这里,我们隐式调用了称为初始化程序的东西。
在上面的场景中,Initializer 负责制作字符数组。
初始化器在幕后执行此操作:

char str[5];

str[0] = 'h';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';

C是一种非常低级的语言。您的声明:

char str[] = another_str;

对 C 没有意义。不可能整个数组分配给 C 中的另一个数组。您必须手动或使用 strcpy() 函数逐字母复制。在上面的语句中,初始化器不知道another_str数组变量的长度。如果您对字符串进行硬编码而不是 put another_str,那么它将起作用。

其他一些语言可能允许做这样的事情......但你不能指望手动汽车自动换档。你负责它。

于 2015-10-25T07:18:32.137 回答
-1

C中,您必须保留内存来保存字符串。
当您定义一个常量字符串,然后分配给一个 char[] 时,这会自动完成。

另一方面,当您编写 时string2 = string1
您实际上在做的是分配指针到字符对象的内存地址。如果string2is 声明为char*(pointer-to-char),那么它是有效的赋值:

char* string2 = "Hello.";

该变量string2现在保存 char "Hello." 的常量数组的第一个字符的地址。

也可以写 string2 = string1 when string2is a char*and string1is a char[]

但是,假设 achar[]在内存中具有恒定地址。不可修改。
所以,不允许写这样的句子:

 char string2[];
 string2 = (something...);

但是,您可以修改 string2 的单个字符,因为它是一个字符数组:

 string2[0] = 'x'; /* That's ok! */
于 2013-08-24T01:25:53.230 回答