c字符串基础,为什么未分配?

时间:2010-09-26 20:25:18

标签: c string char declaration variable-assignment

我正在尝试学习基础知识,我认为声明char []并为其分配字符串会起作用。 感谢

int size = 100;
char str[size];

str = "\x80\xbb\x00\xcd";

给出错误“分配中的不兼容类型”。怎么了? 感谢

7 个答案:

答案 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运算符的目标的事实)。

要将一个数组的内容复制到另一个数组,您必须使用类似=memcpymemmove等库函数。此外,对于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)。