Объявление символьной строки со статическим размером - PullRequest
2 голосов
/ 02 апреля 2019

Я пробовал разные способы объявить строку в C для подготовки к экзамену. Мы знаем, что строка в C является символьным массивом с '\0' в конце. Затем я обнаружил, что даже если я объявляю массив из 5 символов и помещаю в него 5 символов, таких как «abcde», он принимается. Тогда где хранится нулевой символ?

Я объявил строки следующим образом

char str[] = {'a','b','c','d','e'};
char str2[] = "abcde";
char str3[5] = "abcde";

Теперь, в третьем случае, я выделяю 5 байт пространства, и у меня есть ровно 5 символов в массиве, тогда если строка должна иметь нулевой символ в конце, где она хранится? Или дело в том, что ноль не добавлен? А как насчет 1-го и 2-го случаев, там добавлены нулевые значения? strlen() возвращает 5 во всех 3 случаях.

Ответы [ 2 ]

6 голосов
/ 02 апреля 2019

Символ NUL сохраняется только во втором примере

char str2[] = "abcde";

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

Если код обрабатывает их правильно как строки, это был неудачный результат неопределенного поведения .

#include <stdio.h>

int main(int argc, char *argv[])
{
    char str[] = {'a','b','c','d','e'};
    char str2[] = "abcde";
    char str3[5] = "abcde";
    printf("%zu\n", sizeof str);
    printf("%zu\n", sizeof str2);
    printf("%zu\n", sizeof str3);
}

Вывод программы:

5
6
5
2 голосов
/ 02 апреля 2019

В третьем случае нулевой терминатор не добавляется. Из документации :

Если известен размер массива, он может быть на единицу меньше размера строковый литерал, в этом случае завершающий нулевой символ проигнорировано:

Поэтому, когда вы проверяете его длину с помощью strlen, вы получаете неопределенное поведение (и то же самое, когда вы пробуете его с первым, поскольку это также не строка).

Более того, это недопустимо (для меня в MSVC это ошибка, но почему-то все равно ее компилирует). Допускается превышение длины строки, в этом случае остаток инициализируется нулями.

...