Строка инициализации - PullRequest
       26

Строка инициализации

15 голосов
/ 08 сентября 2008

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

char Str[32] = "\0";

и

char Str[32] = "";

Ответы [ 6 ]

22 голосов
/ 08 сентября 2008

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

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

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

печать

3 2

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

16 голосов
/ 12 сентября 2008

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

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

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

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

Однако, в соответствии со стандартами C и 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 голосов
/ 08 сентября 2008

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

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

1 голос
/ 12 июня 2015

хммм как насчет инициализации указателем?

char *myString = "Here is a string";

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

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

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

1 голос
/ 08 сентября 2008

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

0 голосов
/ 08 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...