Стандарт инициализации для char [] (c-string) - PullRequest
4 голосов
/ 13 июня 2019

рассмотрим следующий фрагмент кода:

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 ]

6 голосов
/ 13 июня 2019

В C ++ 17 и в текущем проекте C ++ 20 , раздел [dcl.init.string] обсуждается инициализация массива символов строковым литералом.Пункт 3 этого раздела гласит:

Если инициализаторов меньше, чем элементов массива, каждый элемент, не инициализированный явно, должен быть инициализирован нулями.

Так что да,все элементы массива, кроме тех, которые инициализируются символами в литерале, гарантированно будут иметь нулевые значения.

0 голосов
/ 13 июня 2019
#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
...