我正在尝试学习基础知识,我认为声明char []并为其分配字符串会起作用。 感谢
int size = 100;
char str[size];
str = "\x80\xbb\x00\xcd";
给出错误“分配中的不兼容类型”。怎么了? 感谢
答案 0 :(得分:7)
你可以使用字符串文字来初始化一个char数组,但你不能分配一个char数组(除了你可以分配任何其他数组) )。 OTOH,你可以分配一个指针,所以允许以下内容:
char *str;
str = "\x80\xbb\x00\xcd";
答案 1 :(得分:4)
这实际上是学习编程语言最困难的部分之一.... str是一个数组,即内存的一部分(大小乘以char,因此大小字符)已被保留并标记为海峡。 str [0]是第一个字符,str [1]是第二个字符... str [size-1]是最后一个字符。 str本身,没有指定任何字符,是指向
时创建的内存区域的指针char str[size]
正如Jerry所说,在C语言中,你无法以这种方式初始化数组。你需要从一个数组复制到另一个数组,所以你可以做这样的事情
strncpy(str, "\x80\xbb\x00\xcd", size); /* Copy up to size characters */
str[size-1]='\0'; /* Make sure that the string is null terminated for small values of size */
总结:在指针,内存区域和数组之间做出区分是非常重要的。
祝你好运 - 我很确定你会在比你想象的更短的时间内掌握这些概念:)答案 2 :(得分:2)
当用作R值时,char数组可以隐式地转换为char *,但是当用作Lvalue时则不能 - 这就是赋值不起作用的原因。
答案 3 :(得分:1)
您无法使用=
运算符分配数组内容。这只是C语言设计的一个事实。您可以在声明中初始化数组,例如
char str[size] = "\x80\xbb\x00\xcd";
但这与作业不同。 请注意,在这种情况下,额外的'\ 0'将被添加到字符串的末尾。
“不兼容类型”警告来自语言如何处理数组表达式。首先,字符串文字存储为具有静态范围的char
数组(意味着它们在程序的生命周期内存在)。所以字符串文字“\ x80 \ xbb \ x00 \ xcd”的类型是“ 4 5个元素的char
数组”。但是,在大多数情况下,数组类型的表达式将隐式地从“N的N元素数组”转换(“衰减”)到“指向T的指针”,并且表达式的值将是第一个的地址数组中的元素。所以,当你写下声明时
str = "\x80\xbb\x00\xcd";
文字的类型被隐式地从“ 4 5元素char
数组”转换为“指向char
”,但是赋值的目标是键入“{-1}}的100个元素数组”,类型不兼容(超出了数组表达式不能成为char
运算符的目标的事实)。
要将一个数组的内容复制到另一个数组,您必须使用类似=
,memcpy
,memmove
等库函数。此外,对于strcpy
来说如果功能正常,源字符串必须以0结尾。
编辑下面的每个R的评论,我已经删除了我的答案中更笨拙的部分。
答案 4 :(得分:0)
要将字符串文字分配给str
数组,您可以使用字符串复制功能strcpy
。
答案 5 :(得分:0)
char a[100] = "\x80\xbb\x00\xcd";
或char a[] = "\x80\xbb\x00\xcd";
答案 6 :(得分:0)
str是数组的名称。数组的名称是第0个元素的地址。因此,str是指针常量。你不能改变指针常量的值,就像你不能改变常数一样(例如你不能做6 = 5)。