Инициализация строки

В чем разница между

char Str[32] = "\0";

и

char Str[32] = "";

Ответы

Ответ 1

Поскольку вы уже объявили размеры, эти два объявления точно равны. Однако, если вы не укажете размеры, вы увидите, что первое объявление делает большую строку:

char a[] = "a\0";
char b[] = "a";

printf("%i %i\n", sizeof(a), sizeof(b));

печатает

3 2

Это потому, что a заканчивается двумя нулями (явным и неявным), а b заканчивается только неявным.

Ответ 2

Хорошо, предполагая, что два случая следующие (чтобы избежать ошибок компилятора):

char str1[32] = "\0";
char str2[32] = "";

Как заявили люди, str1 инициализируется двумя нулевыми символами:

char str1[32] = {'\0','\0'};
char str2[32] = {'\0'};

Однако, согласно стандарту C и С++, если часть массива инициализирована, остальные элементы массива инициализируются по умолчанию. Для символьного массива остальные символы ноль инициализируются нулевым символом (т.е. Нулевые символы), поэтому массивы действительно инициализируются как:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};

Итак, в конце концов, между ними нет никакой разницы.

Ответ 3

Как указывали другие, "подразумевает один завершающий символ" \0 ", поэтому" \0 "фактически инициализирует массив с двумя нулевыми символами.

Некоторые другие ответчики подразумевают, что это "одно и то же", но это не совсем правильно. Не может быть никакой практической разницы - поскольку единственный способ использования массива - ссылаться на него как строку C, начинающуюся с первого символа. Но обратите внимание, что они действительно приводят к двум различным инициализациям памяти, в частности они отличаются тем, что Str [1] определенно нулевая или неинициализирована (и может быть любой, в зависимости от компилятора, ОС и других случайных факторов). Есть некоторые виды использования массива (возможно, не полезные, но все же), которые будут иметь разные типы поведения.

Ответ 4

Если я ошибаюсь, первый будет инициализировать 2 символа до 0 ( "\ 0" и терминатор, который всегда существует, и оставить остальным нетронутым, а последний будет инициализировать только 1 char (терминатор).

Ответ 5

hmmm как насчет инициализации с помощью указателя?

char *myString = "Here is a string";

хотя по традиционным причинам я предпочитаю использовать:

unsigned char *myString = "Here is a string"; 

В этом случае нулевое завершение внедряется компилятором. Вы можете указать указатель на другую строку, и вы независимы указывая любую длину строки.

Ответ 6

Нет никакой разницы. Они оба генерируют ошибку компилятора на необъявленный символ.: P