Строковый литерал ""
имеет тип массива символов char[1]
в C и const char [1]
в C++.
Вы можете представить это следующим образом
В C
chat no_name[] = { '\0' };
или в C++
const chat no_name[] = { '\0' };
Когда строковый литерал используется для инициализации массива символов, все его символы используются в качестве инициализаторов. Итак, для этой декларации
char text[10] = "";
у тебя на самом деле есть
char text[10] = { '\0' };
Все остальные символы массива, у которых нет соответствующих инициализаторов (кроме первого символа text[0]), тогда они инициализируются 0.
Из стандарта C (6.7.9 Инициализация)
14 Массив символьного типа может быть инициализирован строковым литералом символов или строковым литералом UTF-8, необязательно заключенным в фигурные скобки. Последовательные байты строкового литерала (включая завершающий нулевой символ, если есть место или если размер массива неизвестен) инициализируют элементы массива.
а также
21 Если в списке, заключенном в фигурные скобки, инициализаторов меньше, чем элементов или членов агрегата, или в строковом литерале, используемом для инициализации массива известного размера, меньше символов, чем элементов в массиве, остаток агрегата должны быть инициализированы неявно так же, как объекты, которые имеют статическую продолжительность хранения
и наконец
10 Если объект с автоматическим сроком хранения не инициализирован явно, его значение неопределенно. Если объект со статической или потоковой длительностью хранения не инициализирован явно, то:
— если он имеет тип указателя, он инициализируется нулевым указателем;
— если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нулем;
— если это агрегат, то каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами, а любое заполнение инициализируется нулевыми битами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами, а любое заполнение инициализируется нулевыми битами;
Аналогичное написано в стандарте C++.
Учтите, что в C вы можете написать, например, следующим образом
char text[5] = "Hello";
^^^
В этом случае массив символов не будет иметь завершающего нуля, потому что для него нет места. :) Это то же самое, как если бы вы определили
char text[5] = { 'H', 'e', 'l', 'l', 'o' };
person
Vlad from Moscow
schedule
12.11.2016
strncpy()
. Что он должен делать, это то, что он должен делать. - person Sam Varshavchik   schedule 12.11.2016strncpy
работало бы правильно, и вам не нужно было бы добавлять конечный'\0'
, потому чтоstrncpy
увидит байт'\0'
и не будет смотреть дальше него. Если бы это был случай 2,strncy
фактически обрабатывал бы мусорные байты в начале, что довольно плохо. Как уже говорили другие, это правда в случае 3, но я хотел уточнить ваше понимание случаев 1 и 2. - person Alok Singhal   schedule 12.11.2016strncpy
не добавляет завершающий\0
, как это делаетstrcpy
. - person Electric Coffee   schedule 12.11.2016text
в качестве источника или назначения вstrncpy
? Если предназначение, то неважно, что оно содержит. Если вы используетеtext
в качестве источника, то параметрlen
будет = 0, аstrncpy
скопирует'\0'
из источника. - person Alok Singhal   schedule 12.11.2016