Инициализация строки
В чем разница между
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