Я столкнулся с следующим примером использования 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 ()`