différence entre “\ 0” et ‘\ 0’

J’essaie de comprendre le code suivant, mais je suis confus entre “\ 0” et ‘\ 0’.

#define MAX_HISTORY 20 char *pStr = "\0"; for(x=0;x<MAX_HISTORY;x++){ str_temp = (char *)malloc((strlen(pStr)+1)*sizeof(char)); if (str_temp=='\0'){ return 1; } memset(str_temp, '\0', strlen(pStr) ); strcpy(str_temp, pStr); 

Merci d’avance

Les guillemets doubles créent des littéraux de chaîne. Donc "\0" est un littéral de chaîne contenant le caractère unique '\0' , plus un second comme terminateur. C’est une façon idiote d’écrire une chaîne vide ( "" est la manière idiomatique).

Les guillemets simples sont utilisés pour les littéraux de caractères. Par conséquent, '\0' est une valeur de taille int représentant le caractère avec la valeur de codage 0.

Nits dans le code:

  • Ne lancez pas la valeur de retour de malloc() en C.
  • N’échelonnez pas les allocations en fonction de la taille sizeof (char) , c’est toujours 1, cela n’ajoute donc aucune valeur.
  • Les pointeurs ne sont pas des entiers, vous devriez comparer avec NULL général.
  • Toute la structure du code n’a aucun sens, il y a une allocation dans une boucle mais le pointeur est jeté, ce qui laisse beaucoup de mémoire.

Ils sont différents.

"\0" est un littéral de chaîne qui a deux 0 consécutifs et qui est à peu près équivalent à:

 const char a[2] = { '\0', '\0' }; 

'\0' est un int de valeur 0. Vous pouvez toujours utiliser 0 partout où vous devez utiliser '\0' .

\0 est le caractère de fin nul.

"\0" est identique à {'\0', '\0'} . C’est une chaîne écrite par un programmeur confus qui ne comprend pas que les littéraux de chaîne sont toujours automatiquement terminés par zéro. Le code correctement écrit aurait été "" .

La ligne if (str_temp=='\0') n’a pas de sens, elle aurait dû l’être if (str_temp==NULL) . Or, comme cela se produit, \0 est équivalent à 0, ce qui est une constante de pointeur nulle. Le code fonctionne donc, par chance.

Prendre strlen d’une chaîne où \0 est le premier caractère n’a pas beaucoup de sens. Vous obtiendrez une longueur de chaîne nulle.