Почему мы используем memset для заполнения структуры значением 0 в программировании сокетов c? - PullRequest
0 голосов
/ 28 декабря 2018
struct sockaddr_in servaddr, cliaddr; 

// Creating socket file descriptor 
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { 
    perror("socket creation failed"); 
    exit(EXIT_FAILURE); 
} 

memset(&servaddr, 0, sizeof(servaddr)); 
memset(&cliaddr, 0, sizeof(cliaddr));

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

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

В продолжение объяснения @paxdiablo -

Вы можете определить const static экземпляр struct с начальными значениями.

static const struct sockaddr_in EmptyStruct;

Инициализатор структуры может использоваться для установки желаемых начальных значений (могут быть все 0, как в memset)

Затем каждый раз, когда вы хотите сбросить структуру, вы можете

servaddr = EmptyStruct;
cliaddr = EmptyStruct;
0 голосов
/ 28 декабря 2018

Если переменные не объявлены как статическая продолжительность хранения, они будут иметь произвольное значение при создании.Следовательно, всегда полезно установить для них известное значение до , используя их.

Например, если ваш следующий шаг после socket() равен connect() или bind()им очень понадобится конкретное структурное значение для клиента или сервера соответственно.

Это на самом деле не отличается от функции:

void xyzzy(void) {
    int plugh;
    printf("%d\n", plugh);
}

, поскольку она может вывести any значение.

...