字符数组初始化的差异

时间:2015-09-19 11:35:07

标签: c++ arrays

我为字符数组初始化执行以下操作:

  char a[] = "teststring";
  char b[]={'a','a','b','b','a'};

对于第一个,如果我需要获取字符串长度,我必须strlen(a) ....对于我应该做的另一个字符串sizeof(b)/sizeof(b[0])

为什么会出现这种差异?

编辑:(我知道了)

char name[10]="StudyTonight";   //valid character array initialization

char name[10]={'L','e','s','s','o','n','s','\0'};    //valid initialization

请记住,当您通过列出所有字符分别初始化字符数组时,您必须明确提供'\ 0'字符。

我用char b得到它,我们必须添加'\ 0'来进行正确的初始化。

另一个: 因此,可以使用以下两个语句之一使用以null结尾的字符序列来初始化名为myword的char元素数组:

char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello"; 

4 个答案:

答案 0 :(得分:6)

字符串文字,如"teststring",包含双引号之间的字符,以及值为零的终止char。所以

char a[] = "ab";

与;

具有相同的效果
char a[] = {'a', 'b', '\0'};

strlen()搜索值为'\0'的字符。因此,strlen(a)在这种情况下将返回2.

相反,sizeof()获取所用内存的实际大小。由于sizeof(char)为1,因此根据标准中的定义,这意味着sizeof(a)会给出3的值 - 它会计算'a''b''\0'

答案 1 :(得分:5)

a是一个C风格的字符串,即以null结尾的char数组。初始化等同于:

char a[] = {'t','e','s','t','s','t','r','i','n','g','\0'};
但是,

b不是以null结尾的,所以它不是C风格的字符串,你不能使用像std::strlen()这样的函数,因为它们只对C风格的字符串有效。 / p>

答案 2 :(得分:2)

字符串文字扩展为char数组,但也包括终止零字符。所以想想

char a[] = "teststring";

好像你有类型

char a[] = {'t','e','s','t','s','t','r','i','n','g','\0'};

经验法则

每当您在char数组上使用 strlen() 时,使用字符串文字进行初始化。 strlen函数可以被认为是一个简单的扫描终止零char(\0)计算所需的迭代。

关于sizeof

的一个词

即使有时与括号一起使用,sizeof也是一个运算符,是C ++语言的一个组成部分(从C次继承)。在char c[] = "hello";之类的情况下,sizeof(c)将返回6,这正好比strlen(c)多1,您可能会想:"让我们跳过针对终结符的低效扫描&#34 ;但是sizeof会停止这样的"高效"只要它在指针上运行,并且数组可以(并且将)在需要时用作指针。请看以下示例:

#include <iostream>

// naive approach, don't do that
int myarraysize(char s[]) 
{
    return sizeof(s);
}

int main () 
{
    char c[] = "hello";

    std::cout << sizeof(c) << " vs " << myarraysize(c) << std::endl;
    return 0;
}

online demo

答案 3 :(得分:2)

你总是可以写

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

克服“差异”

另请注意

 sizeof(b)/sizeof(b[0])

基本归结为

 sizeof(b)

因为sizeof(char)始终为1.您的公式用于任何其他数组元素类型。