为什么具有单独字符的char数组与字符串文字不同,以空终止符结尾?

时间:2018-04-06 15:10:59

标签: c++ arrays char sizeof null-terminated

我在c ++中使用char数组并编写了这个程序:

int main()
{

char text[] = { 'h', 'e', 'l', 'l', 'o' };  //arrays initialised like this 
                                            //will have a size of the number 
                                            //of elements that you see

char text2[] = "hello"; //arrays initialised like this will have a size of 
                        //the number of elements that you see + 1 (0 on the 
                        //end to show where the end is

cout << endl;

cout << "The size of the first array is: " << sizeof(text) << endl;

cout << endl;

for (int i = 0; i < sizeof(text); i++)
{
    cout << i << ":" << text[i] << endl;
}
cout << endl;

cout << "The size of the first array is: " << sizeof(text2) << endl;

cout << endl;

for (int i = 0; i < sizeof(text2); i++)
{
    cout << i << ":" << text2[i] << endl;
}
cout << endl;

cin.get();

return 0;
}

这个程序给了我输出:

The size of the first array is: 5

0:h
1:e
2:l
3:l
4:o

The size of the first array is: 6

0:h
1:e
2:l
3:l
4:o
5:

我的问题是:是否有一个特殊的原因,与使用字符串文字初始化char数组不同,初始化具有单独字符的char数组最终不会有空终止符(0)?

6 个答案:

答案 0 :(得分:4)

花括号初始化程序只为数组提供指定的值(或者如果数组较大,则其余项目是默认值)。即使项目为char值,它也不是字符串。 char只是最小的整数类型。

字符串文字表示零终止的值序列。

就是这样。

答案 1 :(得分:1)

非正式地,它是"foo"形式的字符串文字中的第二个引号字符,它添加了NUL终止符。

在C ++中,"foo"const char[4]类型,在某些情况下衰减到const char*

这就是语言的运作方式,就是这样。它非常有用,因为它与所有标准库函数很好地吻合,这些函数将字符串建模为指向NUL终止的char s数组中第一个元素的指针。

使用像char text[] = { 'h', 'e', 'l', 'l', 'o' };这样的额外元素进行拼接会使真的烦恼,并且可能会在语言中引入不一致。你会为signed charunsigned char做同样的事情吗?那么int8_t呢?

答案 2 :(得分:1)

  

是否有一个特殊原因,使用单独的字符初始化char数组将不具有空终止符(0)

原因是因为语法......

Type name[] = { comma separated list };

...用于初始化任何类型的 。不只是char

"quoted string"语法是一种非常特定类型的数组的简写,它假设需要一个空终止符。

答案 3 :(得分:0)

您可以通过多种方式自行终止:

char text1[6] = { 'h', 'e', 'l', 'l', 'o' };
char text2[sizeof "hello"] = { 'h', 'e', 'l', 'l', 'o' };
char text3[] = "hello"; // <--- my personal favourite

答案 4 :(得分:0)

当你指定一个双引号分隔的相邻字符集(一个字符串文字)时,假设你想要的是一个字符串。 C中的字符串表示以空值终止的字符数组,因为它对字符串(printfstrcpy等)的函数有所期待。因此,编译器会自动为您添加该null终止符。

当您提供以逗号分隔的逗号分隔的单引号分隔字符列表时,假定您不想要字符串,但您想要一个您指定的确切字符的数组。所以没有添加空终止符。

C ++继承了这种行为。

答案 5 :(得分:0)

一个字符串文字,比如这个"hello"有一个常量字符数组的类型,并按以下方式初始化

const char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

正如所见,字符串文字的类型是const char[6]。它包含六个字符。

因此这个宣言

char text2[] = "hello"; 

也可以写成

char text2[] = { "hello" }; 

实际上取代了以下声明

char text2[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

然后,字符串文字用作字符数组的初始值设定项,其所有字符都用于初始化数组。