2017-01-11 2 views
1

J'ai lu le fragment de code suivant:Quelle est l'implication de memset() pour va_list?

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

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

Quelle est l'implication de memset() ici directement avant va_start()?

Quelle est la différence si la ligne memset() est supprimée?

+0

Il remplit la variable 'args' avec des zéros. –

+2

Où avez-vous trouvé ce code? Je pense que cela est inutile puisque 'va_start' écrit dans' args' après. – Boiethios

+0

Intéressant. 'va_start (args, xxx);' ne ressemble pas à _look_ like initialise 'args' pas plus que' foo (args) 'ne devrait affecter les arguments' main() '' args'. Pourtant, 'va_start' est une macro et affecte' args'. – chux

Répondre

6

L'implication est que le programmeur qui a écrit cela ne sait pas ce qu'ils font, et apprécie perdre du code.

Ils peuvent suivre aveuglément la directive d'un outil d'analyse statique que les variables doivent être initialisées avant leur utilisation.

va_start(args, xxx); fait tout l'initialisation nécessaire, et efface toutes les valeurs 0 qui memset vient de mettre en, ce qui rend le travail de memset sans valeur.

-1

memset définit la mémoire par octet. Peu importe le type d'arguments, en fait, il faut un pointeur void.

Il établira count pas d'emplacements de mémoire après dest au caractère ch

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