为什么我可以指定长度小于数组本身的字符串文字?

时间:2016-07-15 09:33:09

标签: c++ arrays initialization string-literals

我有点困惑,这是允许的:

char num[6] = "a";

这里发生了什么?我是否指定了一个指向数组的指针或将文字值复制到数组中(因此我以后可以修改它们)?

6 个答案:

答案 0 :(得分:5)

  
      
  1. 为什么我可以指定一个小于数组本身的字符串文字?这里发生了什么?
  2.   

这是明确的定义。当initialize character arrays with string literal时,

  

如果指定了数组的大小并且它大于该数字   字符串文字中的字符,其余字符是   初始化为零。

所以,

char num[6] = "a";
// equivalent to char num[6] = {'a', '\0', '\0', '\0', '\0', '\0'};
  
      
  1. 我是否指定了一个指向数组的指针或将文字值复制到数组中(因此我以后可以修改它们)?
  2.   

值为copied,即数组的元素将由字符串文字的字符(包括'\0')初始化。

  

字符串文字可用于初始化字符数组。如果数组初始化为char str[] = "foo";,则str将包含字符串" foo"的副本。

     

字符串文字的连续字符(包括隐式终止空字符)初始化数组的元素。

答案 1 :(得分:3)

char num[6] = "a";

相当于

char num[6] = {'a', '\0', '\0', '\0', '\0', '\0'};

答案 2 :(得分:1)

  

为什么我可以指定一个小于数组本身的字符串文字?

语言允许这样做。稍后能够向数组添加更多字符通常很有用,如果现有字符填充整个数组,则无法实现。

  

我是否指定了一个指向数组的指针

没有。您无法为数组指定指针,因此不会发生这种情况。

  

或将文字值复制到数组

这正是发生的事情。

  

因此我以后可以修改它们

您确实可以修改数组。

答案 3 :(得分:0)

这种声明是一种特殊的语法糖事。它相当于

char num[6] = {'a', 0}

数组总是可以修改的。在这样的声明之后它的内容将是一个表示'a'的字符,一个零(NUL终止符),并且数组的其余部分也将被清零(零初始化)。

答案 4 :(得分:0)

只需使用char num[6] = {"a"};即可。它有效。

答案 5 :(得分:0)

这是一种类型的声明,等同于

char num[6] = {'a','\0'};

您声明了长度为max的c-string。 5个正常的字符,最后必须是\ 0到结束c - 字符串。

通过声明,您可以使用

char num[6] = "a";

然后你需要分配值:

  1. 使用strcpy(dest,src)

    的strcpy(NUM, “测试”);

  2. char by char

    NUM [0] = 'T'; NUM [1] = 'E'; NUM [2] = 'S'; NUM [3] = 'T'; NUM [4] = '\ 0';