假设我有一个名为 string1 的 char 指针,它指向单词“hahahaha”中的第一个字符。我想创建一个 char[] 包含 string1 指向的相同字符串。
这怎么行不通?
char string2[] = string1;
“这怎么行不通?”
因为那不是 C 语言的定义方式。
strdup()
您可以使用[注意strdup()
不是 ANSI C]创建副本
参考:
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);
其中一个的价值变化不会改变另一个
你这样写:
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
,那么它将起作用。
其他一些语言可能允许做这样的事情......但你不能指望手动汽车自动换档。你负责它。
在C中,您必须保留内存来保存字符串。
当您定义一个常量字符串,然后分配给一个 char[] 时,这会自动完成。
另一方面,当您编写 时string2 = string1
,
您实际上在做的是分配指针到字符对象的内存地址。如果string2
is 声明为char*
(pointer-to-char),那么它是有效的赋值:
char* string2 = "Hello.";
该变量string2
现在保存 char "Hello." 的常量数组的第一个字符的地址。
也可以写 string2 = string1 when string2
is a char*
and string1
is a char[]
。
但是,假设 achar[]
在内存中具有恒定地址。不可修改。
所以,不允许写这样的句子:
char string2[];
string2 = (something...);
但是,您可以修改 string2 的单个字符,因为它是一个字符数组:
string2[0] = 'x'; /* That's ok! */