Я не уверен, что будет в массиве char после инициализации следующими способами.
1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";
Для случая 2, я думаю, buf[0]
должно быть ' '
, buf[1]
должно быть '\0'
и от buf[2]
до buf[9]
будет случайным содержимым. Для случая 3, я думаю, buf[0]
должно быть 'a'
, buf[1]
должно быть '\ 0', а от buf[2]
до buf[9]
будет случайное содержимое.
Это правильно?
А что будет в случае 1 buf
? buf[0] == '\0'
а от buf[1]
до buf[9]
будет случайный контент?
char buf[10]; buf = "a";
вовсе не компилировать. - Пожалуйста , попробуйте сначала, а затем копировать / вставить фактический код в вопрос. Это сэкономит вам и всем читателям вашего вопроса уйму работы.Ответы:
Это не то, как вы инициализируете массив, а для:
Первое объявление:
эквивалентно
Вторая декларация:
эквивалентно
Третье заявление:
эквивалентно
Как видите, случайного содержимого нет: если инициализаторов меньше, оставшаяся часть массива инициализируется с помощью
0
. Это так, даже если массив объявлен внутри функции.источник
char
.0
и'\0
имеют то же значение.char buff[3] = "abcdefghijkl";
недействителен.char p3[5] = "String";
также недействителен.char p[6] = "String";
действителен и совпадает сchar p[6] = {'S', 't', 'r', 'i', 'n', 'g'};
.Изменить: OP (или редактор) молча изменил некоторые одинарные кавычки в исходном вопросе на двойные кавычки в какой-то момент после того, как я предоставил этот ответ.
Ваш код приведет к ошибкам компилятора. Ваш первый фрагмент кода:
вдвойне незаконен. Во-первых, в C нет такой вещи, как пустой
char
. Вы можете использовать двойные кавычки для обозначения пустой строки, например:Это даст вам указатель на
NUL
строку, т. Е. На односимвольную строку, содержащую толькоNUL
символ. Но вы не можете использовать одинарные кавычки, в которых ничего нет - это не определено. Если вам нужно обозначитьNUL
символ, вы должны указать его:Обратная косая черта необходима для устранения неоднозначности символа
'0'
.выполняет то же самое, но первое, я думаю, немного менее двусмысленно для чтения.
Во-вторых, вы не можете инициализировать массивы после того, как они были определены.
объявляет и определяет массив. Идентификатор массива
buf
теперь является адресом в памяти, и вы не можете изменить расположениеbuf
точек с помощью присваивания. Такнезаконно. По этой причине ваш второй и третий фрагменты кода являются незаконными.
Чтобы инициализировать массив, вы должны сделать это во время определения:
даст вам массив 10 символов с первым символом , являющегося пространство
'\040'
и остальноеNUL
, то есть'\0'
. Когда массив объявляется и определяется с помощью инициализатора, элементы массива (если есть) за теми, которые имеют указанные начальные значения, автоматически дополняются0
. Никакого «случайного контента» не будет.Если вы объявляете и определяете массив, но не инициализируете его, как показано ниже:
у вас будет случайный контент во всех элементах.
источник
Это эквивалентные
Это эквивалентные
Это эквивалентные
источник
Соответствующая часть инициализации проекта стандарта C11 n1570 6.7.9 гласит:
и
Таким образом, добавляется '\ 0', если места достаточно , а остальные символы инициализируются значением,
static char c;
которое будет инициализировано внутри функции.В заключение,
Таким образом,
char
будучи арифметическим типом, остаток массива также гарантированно инициализируется нулями.источник
Интересно, что массивы можно инициализировать любым способом в любое время в программе, при условии, что они являются членами
struct
илиunion
.Пример программы:
источник
Я не уверен, но я обычно инициализирую массив как "", в этом случае мне не нужно беспокоиться о нулевом конце строки.
источник
main()
(и вы также должны использоватьvoid
, напримерint main(void) { ... }
,. C99 избавился от этого правила, поэтому этот код не будет компилироваться для C99 и более поздних версий. Также следует отметить, что, начиная с C99, если вы опуститеreturn
в main, есть автоматическоеreturn 0;
размещение / подразумевается перед}
концом main. Вы используете неявное правило int, которое работает только до C99, но вы используете неявное,return
которое работает только с C99 и более поздними версиями ; эти два явно противоречат .