char [](c-string)的初始化标准

时间:2019-06-13 02:42:07

标签: c++ standards c-strings

请考虑以下代码:

int main(){
    char hi[5] = "Hi!";
    printf("%d", hi[4]);    
}

将打印什么?更重要的是,在最新 C ++ 标准中,标准中是否会提及要打印的内容?如果有提及,它在哪里?

由于某种原因,关于此的最新信息非常难以找到,并且各种来源的信息相互矛盾。我尝试过en.cppreference.com和cplusplus.com,前者没有任何信息,后者声称这些值不确定。但是,

using namespace std;
int main(){
    char mySt[1000000] = "Hi!";
    for(int i=0;i<1000000;++i){
        if(mySt[i]!='\0') cout << i <<endl;
    }
}

这在我的系统上仅打印0、1和2,因此我希望将“ rest”初始化为“ \ 0”。而且据我所知char mySt[100000]=""初始化了整个数组'\0',只是说它与任何其他字符串文字不同而感到尴尬。但是,如果我的讲师提出其他要求(他认为这是“未定义的”),则我需要用最新且具体的证据(如果有)来备份我的主张。

我在MinGW g ++ 8.2.0上编译。预先谢谢你。

为了澄清,

2 个答案:

答案 0 :(得分:6)

在C ++ 17和the current C++20 draft中,[dcl.init.string]节都讨论了如何使用字符串文字来初始化字符数组。该部分的第3段内容如下:

  

如果初始化程序少于数组元素,则每个未显式初始化的元素都应进行零初始化。

所以,是的,除了文字中的字符初始化的数组元素外,所有其他数组元素都保证为零值。

答案 1 :(得分:0)

#include <stdio.h>
int main()
{
    char mystr[5] = "Hi!";
    for ( int i = 0; i < sizeof (mystr); i++)
        printf("%d\n", mystr[i]);   
}

=======输出======

./a.out 
72
105
33
0
0