Связь между массивом символов calloc и нулевым завершающим символом - PullRequest
0 голосов
/ 27 июня 2018

Вся эта "дискуссия" в сети о том, что strncpy безопасна против небезопасна, сводит меня с ума. Я нахожу некоторых людей, которые говорят, что strncpy - это «дьявол», что для меня звучит так, будто им не хватает дисциплины программирования. Я получаю, что в конце dest не добавляется символ \0, когда src больше dest (что в конечном итоге вызывает проблемы). Я слышал о strlcpy, но из того, что я понял, это не стандартно. Я хочу, чтобы мой код был максимально переносимым, поэтому я не считаю это жизнеспособным решением.

Вот мое текущее решение ...

Сначала определите размер буфера

#define BUFSIZE 1024

Внутри программы выделите буфер, используя calloc

char *buffer;

buffer = calloc(BUFSIZE+1, sizeof(char));

Затем в коде, скажем, я хочу скопировать msg в buffer, и я использую

strncpy(buffer,msg,BUFSIZE);

Так как я предварительно выделил buffer с BUFSIZE + 1, то это гарантирует, что последний байт buffer равен \0 независимо от того, больше ли msg чем BUFSIZE.

Теперь вопрос в том, инициализирует ли calloc массив символов с \0? Неправильно ли интерпретировать нулевое распределение calloc так же, как \0?

1 Ответ

0 голосов
/ 27 июня 2018

Очистка массива до 0 заполнит все символы до \0.

Таким образом, '\ 0' полностью эквивалентно неизмененной целочисленной константе 0 - единственное отличие состоит в том, что намерение, которое оно передает читателю-человеку («Я использую это как нулевой символ.»).

См. В чем разница между NULL, '\ 0' и 0

...