La nécessité de memset avec ‘\ 0’, dans un exemple de jouet

J’ai rencontré l’exemple suivant d’utilisation de memset dans tutorialspoint : (je ne suis pas familier avec 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 ssortingng : %s\n", dest); return(0); } 

Je ne comprends pas pourquoi la ligne memset est utilisée, car la compilation et le résultat sont identiques lorsque cette ligne est commentée. Je voudrais demander si cette ligne est nécessaire? ou est-ce une bonne pratique de le faire en faisant strcpy ()? ou c’est juste une ligne aléatoire.

Merci!

Ce n’est pas nécessaire dans ce cas, en ce sens que cela n’a aucun effet sur la sortie. Cela pourrait être nécessaire dans des cas similaires.

 char dest[100]; 

Ceci définit dest comme un tableau local de 100 caractères. Sa valeur initiale est garbage. Cela aurait pu être écrit comme:

 char dest[100] = ""; 

ou

 char dest[100] = { 0 }; 

mais aucune de celles-ci n’est nécessaire car une valeur est affectée à dest avant son utilisation.

 strcpy(src, "This is tutorialspoint.com"); strcpy(dest, src); 

Ceci copie la chaîne contenue dans src dans le tableau dest . Il copie les 26 caractères de "This is tutorialspoint.com" plus 1 caractère supplémentaire, le '\0; qui marque la fin de la chaîne. Le contenu précédent du tableau de dest est ignoré. (Si nous strcat() , cela aurait de l’importance, car strcat() doit trouver un '\0' dans la destination avant de pouvoir commencer à copier.)

Sans l’appel de memset() , les 73 octets restants de dest seraient des ordures – mais cela n’aurait pas d’importance, car nous ne regardons jamais rien au-delà du '\0' dans dest[26] .

Si, pour une raison quelconque, nous avons décidé d’append quelque chose comme:

 printf("dest[99] = '%c'\n", dest[99]); 

au programme, alors le memset() importera. Mais puisque le but de dest est de contenir une chaîne (qui est par définition terminée par un caractère nul '\0' ), ce ne serait pas une chose sensée à faire. Parfaitement légal, mais pas raisonnable.

le code posté pourrait ignorer l’initialisation via memset() .

Un moment où cela devient vraiment utile est lors du débogage et vous utilisez le débogueur pour afficher le contenu de la variable.

Une autre utilisation de memset() consiste à allouer quelque chose comme un tableau de pointeurs, qui peuvent ne pas tous être configurés pour pointer sur quelque chose de spécifique, comme plus de mémoire allouée.

Ensuite, lorsque ces pointeurs sont passés à ‘free (), the unused pointers are set to NULL, so will not cause a crash when passed to free () `