Строки с завершающим нулем, созданные с помощью calloc?

Я хочу выделить память для строки с помощью calloc, я знаю, что calloc заполняет всю выделенную память 0, но я также обнаружил, что они отличаются от \ 0 в некоторых контекстах. Все это обсуждение сбивает с толку новичка (такого как я), поэтому мне было интересно, может ли кто-нибудь дать мне окончательный ответ, если я использую alloc для инициализации строки, мне нужно вручную установить последний символ на "\ 0" или не?


person B.Castarunza    schedule 14.05.2020    source источник
comment
calloc zero инициализирует выделенную память. а '\ 0' - ноль. :)   -  person Vlad from Moscow    schedule 15.05.2020
comment
Буквальный символ '\0' на самом деле является восьмеричным escape-символом для 0. Таким образом, нулевой терминатор '\0' действительно равен нулю.   -  person Some programmer dude    schedule 15.05.2020
comment
Главное, что нужно помнить при выделении памяти для строк, - это включить место для терминатора.   -  person Some programmer dude    schedule 15.05.2020
comment
Спасибо всем за быстрые ответы!   -  person B.Castarunza    schedule 15.05.2020
comment
Есть несколько причин, по которым это может пойти не так. 1) вы выделяете 5 байтов с помощью calloc, а затем помещаете в эту память строку из 5 символов (например, привет). Это не сработает, потому что hello нужно 6 байтов, 5 для букв и еще один для '\0' в конце. 2) вы выделяете 6 или более байтов, помещаете hello в память, а затем пытаетесь изменить строку на hi. Это не сработает, если после i не будет '\0'. Без '\0' вы получите привет.   -  person user3386109    schedule 15.05.2020
comment
@ user3386109 Понятно, второе, конечно, полезное напоминание, спасибо   -  person B.Castarunza    schedule 15.05.2020


Ответы (1)


Нет никакой разницы между целым значением 0, которым calloc заполняет выделенную память, и буквальным символом '\0', который идентичен целочисленному значению 0.

Таким образом, если вы запишете до n-1 символов в блок памяти из n символов, выделенный с помощью calloc, у вас всегда будет действительная строка с завершающим нулем.

person Stephan Lechner    schedule 14.05.2020