查看以下代码片段
char ch[10] = "hello"; // is ok
但
char ch[10];
ch = "hello"; // showing lvalue error
根据数组衰变成指针的概念,它应该是可能的。为什么这里的ch不会衰减为char *? 请描述两者之间的区别。
答案 0 :(得分:2)
数组不可分配。如果你需要动态分配一个字符串,那么你可以预先创建一个固定长度的缓冲区并填充它,或者B)动态分配内存,然后再填充它。
这完全取决于你是否事先知道大小(虽然C确实支持可变长度数组,但要小心)或者你需要容纳任意长度的字符串。
要将字符串复制到现有缓冲区(使用自动存储持续时间或其他方式分配),您可以使用strcpy
,strncpy
(用于插入现有字符串),strdup
(POSIX) ,用fgets
或其他适当的方法阅读。请注意缓冲区大小和字符串长度。
答案 1 :(得分:2)
char ch[10] = "hello";
是初始化,并且是标准允许的。它实际上是“给我一个十字符数组并用C字符串填充它"hello"
。
char ch[10];
ch = "hello";
是(尝试)分配,不允许。你可以这样做:
char *ch;
ch = "hello";
但最后你得到了一个你不允许修改的ch
(关于你是否允许修改字符串常量,这是未定义的行为。)
在初始化时间之后,使用数组进行“赋值”的一种方法是:
char ch[10];
strcpy (ch, "hello");
答案 2 :(得分:2)
您应该了解初始化和分配之间的区别。初始化是定义一个变量并在同一语句中为其赋值。以下语句定义类型为ch
的变量char[10]
- 一个10
个字符数组,然后将其赋值为字符串文字。
char ch[10] = "hello";
这相当于
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0'};
请注意,您只分配数组6
的第一个ch
元素,其余的4
被隐式初始化为空字符 - '\0'
。因此,上述两个陈述与:
char ch[10] = {'h', 'e', 'l', 'l', 'o', '\0', '\0', '\0', '\0', '\0'};
赋值是指您首先定义变量,然后在单独的语句中为其赋值。
char ch[10]; // define ch of type char[10]. contains garbage right now.
在定义它之后不应该使用ch
,因为它包含垃圾值。接下来,您应该为其分配一个值,但是您不能像在初始化中那样分配它。 C
的规则不允许这样做。您不能一次性分配数组的所有元素,但必须分别分配数组的每个元素。
char ch[10];
const char *s = "hello";
int len = strlen(s);
for(int i = 0; i <= len; i++) // copy the null byte as well
ch[i] = s[i];
此处,您只分配了数组6
的第一个ch
元素,剩余的4
仍然包含垃圾值,除非您指定它们。这是数组初始化和赋值之间的一个区别。
答案 3 :(得分:1)
这个
char ch[10];
ch = "hello";
在C中无效。声明阵列后,您无法重新分配它。数组的名称实际上是该数组的第一个元素的地址。 ch
是一个数组,hello
也是数组,它没有名称,但它有自己的地址,因此ch = "hello";
行尝试重新分配ch
另一个地址,无效。
你只能
strcpy(ch,"hello");
将hello
放入其中
答案 4 :(得分:1)
案例1: -
char ch[10] = "hello";
将基地址设为1000
通过你的声明
1000 - &gt; ^ h
1001 - &gt; Ë
1002 - &gt;升
1003 - &gt;升
1004 - &gt; Ø
1005 - &gt; \ 0
ch指向1000
。
案例2: -
char ch[10];
ch="hello";
1000 - &gt;垃圾
1001 - &gt;垃圾
1002 - &gt;垃圾
1003 - &gt;垃圾
1004 - &gt;垃圾
1005 - &gt;垃圾
等等
请注意hello
是一个独立的字符串,有自己的地址,所以ch="hello"
您正在尝试ch
指向h
中"hello"
的新地址。
这是不可能的,因为ch
的类型为char *const
。
我的意思是说ch
将始终指向其基址,并且您无法更改数组的基址。
您可以更改数组的值,但不能更改数组元素的地址。
答案 5 :(得分:0)
ch =“hello”不是初始化,它是赋值。此外,"hello"
类型和ch
类型也不同。
将其更改为char ch[10] ="hello"
。