2017-01-11 10 views
1

я прочитал следующий фрагмент кода:Каково значение memset() для va_list?

va_list args; 
memset(&args, 0, sizeof(va_list)); 

va_start(args, xxx); 
... 
va_end(args); 

Что прикосновенность memset() здесь непосредственно перед va_start()?

В чем разница, если линия удалена?

+0

Он заполняет переменную 'args' нулями. –

+2

Где вы нашли этот код? Я думаю, что это бесполезно, поскольку 'va_start' пишет в' args' после. – Boiethios

+0

Интересно. 'va_start (args, xxx);' no_look_ like 'инициализирует 'args' больше, чем' foo (args) ', как ожидается, не повлияет на' main() '' 'args'. Однако 'va_start' является макросом и влияет на' args'. – chux

ответ

6

Смысл в том, что программист, который написал это не знает, что они делают, и любит тратить код.

Они могут слепо следовать указаниям какого-либо инструмента статического анализа, чтобы переменные были инициализированы до их использования.

va_start(args, xxx); делает всю необходимую инициализацию, и перезаписывает все 0-значения, которые memset просто положить в, делая работу memset бесполезной.

-1

memset устанавливает память по очереди. Неважно, что такое аргументы, на самом деле он принимает указатель void.

Он будет установлен count нет ячеек памяти после того, как dest к персонажу ch

void* memset(void* dest, int ch, size_t count)