字符数组初始化

时间:2014-02-23 09:52:19

标签: c string

查看以下代码片段

char ch[10] = "hello"; // is ok

char ch[10];
ch = "hello"; // showing lvalue error

根据数组衰变成指针的概念,它应该是可能的。为什么这里的ch不会衰减为char *? 请描述两者之间的区别。

6 个答案:

答案 0 :(得分:2)

数组不可分配。如果你需要动态分配一个字符串,那么你可以预先创建一个固定长度的缓冲区并填充它,或者B)动态分配内存,然后再填充它。

这完全取决于你是否事先知道大小(虽然C确实支持可变长度数组,但要小心)或者你需要容纳任意长度的字符串。

要将字符串复制到现有缓冲区(使用自动存储持续时间或其他方式分配),您可以使用strcpystrncpy(用于插入现有字符串),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"