11
votes

Char \ 0 Séquence d'échappement - Qu'est-ce que cela signifie?

Je lis cet exemple

Le vrai "monde Hello!" Pour Cuda!
Qu'est-ce que le \ 0 dans xxx

stand pour?

Je ne sais pas pourquoi le 16 char str a "bonjour" à l'intérieur, puis tous les zéros alors (ce n'est pas une variable globale). Comment puis-je être sûr qu'il contient juste des zéros? "

c c++

9 commentaires

Ceci est aussi bon que char Str [16] = "bonjour";


@iammilind Je suis sûr que c'est pire. Et le fait qu'il a causé cette question est la preuve de cela.


"\ 0" représente Nul en ASCII, et il est utilisé dans les chaînes C comme terminateur de la chaîne. Pour plus d'informations, essayez de regarder en.wikipedia.org/wiki/null-terminé_string


Vous ne pouvez pas vous attendre à ce que tout le monde suit le lien ou le lit. Vous devriez mentionner que c'est sur Cuda qui est important dans ce cas. Avec CUDA ou Calcul de GPU en général, il pourrait être moins cher au pad avec \ 0 au lieu d'ajouter une logique de longueur.


Les deux premiers commentaires ici ont complètement manqué pourquoi ces nuls sont là. Bien sûr, le même code serait généré s'il n'y avait pas, mais le fait qu'il y ait exactement six d'entre eux est important et constitue un indicateur de leur objectif. Le fait que la présence de \ 0 a provoqué quelqu'un de demander ce que \ 0 signifie évidemment ne "prouve" pas que leur présence rend le code pire.


@Jimbalter en supposant une seconde dans laquelle vous avez raison sur le but de \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 , le fait que beaucoup d'entre nous "ont manqué", "prouve" «Pour moi que le code est mauvais, au moins sans commentaire à côté d'elle expliquant le but. Même avec une aversion torsadée du code documenté, quelque chose comme Char str [16] = "Bonjour 123456"; serait supérieur, si seulement pour éviter toute imagination sauvage impliquant nul , null ou pittoresque cuda-ismsms.


Cette question devrait probablement aussi être étiquetée cuda, non? Les gens semblent manquer le point.


@busy_wait peut-être, mais cela n'a vraiment rien du tout à faire avec le fait que c'est Cuda.


@iammilind: Vous voulez sûrement dire Char Str [16] = "Bonjour"; - Mind the Gap, Erruption Espace.


3 Réponses :


6
votes

\ 0 signifie "code> nul , nul est utilisé comme caractère de terminaison de chaîne. Ce qui signifie qu'il indique la fin d'une chaîne. La valeur d'un octet nul est 0x00


9 commentaires

Non, c'est nul (comme dans le caractère ASCII) non pas null comme dans (void *) 0 .


@ Devzer0, je n'allais pas descendre, mais vous n'allez pas avoir le point. '\ 0' est le caractère nul ASCII. NULL est un pointeur, souvent défini comme (vide *) 0 . Oui, ils sont tous deux zéro, mais ils sont des valeurs typées différemment avec des significations différentes.


Cela dit que c'est le "caractère nul", abrégé nul (tel qu'il apparaît dans la table ASCII). Il ne dit rien sur null .


@ Devzer0 null , comme la macro, peut par exemple avoir une valeur (vide *) 0 in c, et 0L en C ++. Vous ne prétendez pas que ce soit un octet nul, n'est-ce pas?


@Jonathonreinhart Do Your Dit Null! = Nul?


@ Devzer0 alors retirez la modification à la fin. Cela n'a toujours aucun sens concernant cette réponse.


@ Devzer0 de la même manière que "un vecteur" n'est pas le même que std :: vecteur . Même nom, utilisé pour des raisons similaires, mais pour décrire différentes choses: ASCII définit une valeur de caractère nommée nul pour être "le caractère null" avec valeur 0. C ++ définit null à Soyez une constante avec la valeur 0. Bien sûr, ils sont liés, mais ils ne sont pas les mêmes.


Merci beaucoup pour une discussion très informative, j'ai personnellement appris beaucoup. Merci.


Les nuls dans ce cas n'ont rien à voir avec la fin de la chaîne. Il pourrait être utile de lire les commentaires dans le code.



2
votes

Comme indiqué, il a peu de sens. \ 0 CODE> Il suffit de placer le caractère avec le code 0 là-bas, mais cela arrive de toute façon. Le bon usage de ceci est l'endroit où les limites du tableau ne sont pas données, car le montant supplémentaire 0 comptera dans ou où vous avez plus de caractères après 0.

char foo_and_bar[] = "Foo\0Bar";


3 commentaires

Comme indiqué, il a beaucoup de sens. Ces six \ 0 sont des espaces réservés qui marquent les octets qui seront remplacés par "World!". Ils ne sont pas nécessaires, mais ils sont destinés à rendre le code plus clair.


@Jimbalter souligne juste que les octets zéro ne sont pas remplacés par "World!".


@Jonathonreinhart Oui, j'ai mal compris le code; Merci pour la clarté de votre réponse ci-dessus.



24
votes

'\ 0' est le ASCII nul caractère null (code ASCII zéro).

Il y a Aucun point de spécification de tous les octets zéro dans le tableau. Les éléments suivants sont équivalents: xxx

Si un tableau est partiellement initialisé, les éléments qui ne sont pas initialisés reçoivent la valeur 0 du type approprié. [IBM]

car la longueur a été donnée à 16, le compilateur assurera automatiquement le reste de la matrice (après "bonjour" est mis à zéro.) L'auteur a fait cela soit à "être Bien sûr, "le reste de la matrice était égal à zéro ou de servir de documentation pour le lecteur.

Contrairement à nos analyses initiales, le noyau Cuda est pas " piquer en octets "à Ajouter World! à la chaîne existante. Bonjour est imprimé en premier. Ensuite, le noyau modifie la chaîne pour être world! , qui est enfin imprimé.

La seule raison pour laquelle la chaîne est spécifiée à 16 octets, est que c'est parce que c'est la taille du bloc. Le noyau est conçu pour travailler avec et il doit s'assurer que le noyau ne joue pas avec la mémoire, il ne devrait pas être.

J'ai ajouté des commentaires au code original (partiel) pour faire cela tout plus clair: xxx


8 commentaires

@glglgl i j'approuve votre édition. Si je l'ai réalisé, j'aurais fait la même chose :-)


[Printf passé un tampon] "Imprimer une bouquet de poubelles" ... ou un crash.


Je doute que l'auteur essaie de s'assurer de quoi que ce soit ... Ces \ 0 ne sont que des espaces réservés pour les octets qui seront remplacés par "World!" ... ils sont une forme de documentation. Ce qu'ils ne sont certainement pas (contrairement à certaines autres réponses et commentaires ici) sont des terminateurs à chaîne.


@Jimbalter m'explique plus sur la façon dont ils "ne sont certainement pas ... Terminants à cordes".


Parce que, comme je viens de le dire, ce sont des espaces réservés qui seront remplacés par "World!". Tous les nul n'ont pas pour but de mettre fin à une chaîne.


"Printf souhaiterait ... ou ..." - ceux-là ne sont pas les seules possibilités; Le comportement est indéfini .


@Jimbalter Vos commentaires m'ont fait retourner et jettent un coup d'œil au code Cuda. J'ai réalisé maintenant que cela n'a rien à voir avec la résiliation null dans ce cas.


Au lieu de ancienne partie de réponse , je pense que vous devriez supprimer cette partie de réponse.