假设我有一个名为string1的char指针指向单词“hahahaha”中的第一个字符。我想创建一个char [],其中包含string1指向的相同字符串。
为什么这不起作用?
char string2[] = string1;
答案 0 :(得分:3)
“为什么这不起作用?”
因为那不是C语言的定义方式。
您可以使用strdup()
创建副本[请注意strdup()
不是ANSI C]
参考文献:
答案 1 :(得分:1)
在C中你可以这样做:
char string1[] = "hahahaha";
char string2[sizeof(string1)+1];
strcpy( string2, string1 );
当string1
定义为具有常量初始化程序的上述(数组)时,编译器在编译时知道其长度,sizeof
将返回它的长度,包括空终止符(即大小)数据)。
答案 2 :(得分:0)
1)指针string2 ==指针string1
任何一个值的变化都会改变另一个
来自海报poida
char string1[] = "hahahahaha";
char* string2 = string1;
2)制作副本
char string1[] = "hahahahaha";
char string2[11]; /* allocate sufficient memory plus null character */
strcpy(string2, string1);
其中一个的价值变化不会改变另一个
答案 3 :(得分:0)
在 C 中,您必须保留记忆以保存字符串 这在定义常量字符串时自动完成,然后分配给char []。
另一方面,当你写string2 = string1
时,
你实际在做的是分配指向char 对象的内存地址。如果string2
声明为char*
(指向char的指针),那么赋值是有效的:
char* string2 = "Hello.";
变量string2
现在保存char“Hello”的constanta数组的第一个字符的地址。
当string2
为char*
且string1
为char[]
时,写下string2 = string1也没关系。
但是,假设char[]
在内存中具有常量地址。不可修改。
所以,不允许写这样的句子:
char string2[];
string2 = (something...);
但是,您可以修改string2的各个字符,因为它是一个字符数组:
string2[0] = 'x'; /* That's ok! */
答案 4 :(得分:0)
如果你想初始化2个char数组,那么唯一的方法就是为它们分配第一个字符串或副本。
#define HAHA "hahahahaha"
char string1[] = HAHA;
char string2[] = HAHA;
答案 5 :(得分:0)
你写的是这样的:
char str[] = "hello";
......实际上变成了这个:
char str[] = {'h', 'e', 'l', 'l', 'o'};
这里我们隐含地调用了一个叫做初始值设定项的东西 在上面的场景中,初始化程序负责制作字符数组 初始化程序在场景后面执行此操作:
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
数组变量的长度。如果您对字符串进行硬编码而不是放置another_str
,那么它将起作用。
其他一些语言可能会允许这样做......但是你不能指望手动车自动换档。你负责它。
答案 6 :(得分:-1)
您可以使用如下指针将string1的地址分配给string2:
#include <stdio.h>
int main(int argc, char** argv) {
char* string1 = "hahahahaha";
char* string2 = string1;
printf("%s\n", string2);
}