C ++ Безопасно ли работать с массивом символов, если в качестве первого значения массива задан нулевой терминатор? - PullRequest
0 голосов
/ 13 мая 2018

Если бы я выделил такую ​​строку, было бы безопасно работать?то есть я должен ожидать какой-либо UB при записи / чтении в / из него?

void example()
{
    char exmapleString[32];
    char exmapleString[0] = '\0';
}

Даже если exmapleString содержит данные мусора из-за неправильной инициализации (то есть char exmapleString[32] = { 0 };), я установил первое значениемассива exmapleString в \0, поэтому, если бы я пропустил его через такие функции, как strcpy, strcat и т. д. ... Терминатор NULL был бы помещен в конец строки, так что это означает, что эта строкабезопасно работать с ним, если я инициализирую его следующим образом и установлю первое значение массива на \0?

Так что, несмотря на все проведенные мною тесты, похоже, что он работает нормально.

Эта функция работает

void example()
{
    char exmapleString[32];
    char exmapleString[0] = '\0';
    strcat(exmapleString, "test");
    print(exmapleString);
}

Но эта функция будет (большую часть времени) печатать мусорные данные

void example()
{
    char exmapleString[32];
    strcat(exmapleString, "test");
    print(exmapleString);
}

Что заставляет меня поверить, что да, действительно, установка строки типаэто

char exmapleString[32];
char exmapleString[0] = '\0';

не должно приводить ни к какому UB.Это верно?Или это будет считаться небезопасным?

...