Необходимость memset с ‘\ 0’, в примере с игрушкой

Я столкнулся с следующим примером использования memset в tutorialspoint : (я не знаком с C.)

#include  #include  int main(){ char src[40]; char dest[100]; memset(dest, '\0', sizeof(dest)); strcpy(src, "This is tutorialspoint.com"); strcpy(dest, src); printf("Final copied string : %s\n", dest); return(0); } 

Я не понимаю, почему используется строка memset, поскольку компиляция и результат совпадают, когда эта строка комментируется. Хотелось бы спросить, нужна ли линия? или это хорошая практика для этого при выполнении strcpy ()? или это всего лишь одна случайная линия.

Спасибо!

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

 char dest[100]; 

Это определяет dest как локальный массив из 100 char . Его первоначальным значением является мусор. Это могло бы быть написано как:

 char dest[100] = ""; 

или же

 char dest[100] = { 0 }; 

но ни один из них не требуется, поскольку dest назначается значение до его использования.

 strcpy(src, "This is tutorialspoint.com"); strcpy(dest, src); 

Это копирует строку, содержащуюся в src в массив dest . Он копирует 26 символов "This is tutorialspoint.com" плюс 1 дополнительный символ, завершающий '\0; который знаменует конец строки. Предыдущее содержимое массива dest игнорируется. (Если бы мы использовали strcat() , это было бы важно, потому что strcat() должен найти '\0' в пункте назначения, прежде чем он сможет начать копирование.)

Без вызова memset() оставшиеся 73 байта dest будут мусором, но это не имеет значения, потому что мы никогда не смотрим на что-либо за '\0' в dest[26] .

Если по какой-то причине мы решили добавить что-то вроде:

 printf("dest[99] = '%c'\n", dest[99]); 

к программе, то memset() будет иметь значение. Но так как цель dest состоит в том, чтобы удерживать строку (которая по определению заканчивается символом '\0' ), это не было бы разумным делом. Совершенно законный, но не разумный.

опубликованный код может пропустить инициализацию через memset() .

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

В другой раз, когда вы используете memset() выделяете что-то вроде массива указателей, которые могут не все указывать на что-то конкретное, например, больше выделенной памяти.

Затем при передаче этих указателей на «free () the unused pointers are set to NULL, so will not cause a crash when passed to free ()`