2016-04-27 3 views
3

я столкнулся следующий пример использования MemSet в tutorialspoint: (я не знаком с С.)Необходимость MemSet с « 0», в примере игрушек

#include <stdio.h> 
#include <string.h> 

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()? или это всего лишь одна случайная линия.

Спасибо!

+3

Это не требуется. – immibis

+2

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

+1

Некоторым людям просто нужно быть осторожными с их переменными, чтобы они не рисковали иметь дело с неинициализированными данными. Это немного параноидальная ИМО, но это не так, как будто у нее нет никаких заслуг. В этом конкретном случае это кажется немного экстремальным. – Dolda2000

ответ

6

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

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' нулевым символом), это не было бы разумной задачей. Совершенно законный, но не разумный.

1

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

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

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

Тогда при прохождении этих указателей на «свободный() the unused pointers are set to NULL, so will not cause a crash when passed to бесплатно()`

 Смежные вопросы

  • Нет связанных вопросов^_^