Je lis cet exemple
Le vrai "monde Hello!" Pour Cuda! stand pour? P> Je ne sais pas pourquoi le 16 char
Qu'est-ce que le \ 0 code> dans p> str code> a "bonjour" code> à 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? " P> p>
3 Réponses :
\ 0 code> signifie "code> nul code>, 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 code> p>
Non, c'est nul code> (comme dans le caractère ASCII) non pas null code> comme dans (void *) 0 code>.
@ Devzer0, je n'allais pas descendre, mais vous n'allez pas avoir le point. '\ 0' code> est le caractère nul code> ASCII. NULL code> est un pointeur, souvent défini comme (vide *) 0 code>. 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 code> (tel qu'il apparaît dans la table ASCII). Il ne dit rien sur null code>.
@ Devzer0 null code>, comme la macro, peut par exemple avoir une valeur (vide *) 0 code> in c, et 0L code> 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 code>. 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 code> pour être "le caractère null" avec valeur 0. C ++ définit null code> à 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.
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";
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.
Il y a Aucun point de spécification de tous les octets zéro dans le tableau. Les éléments suivants sont équivalents: p> Si un tableau est partiellement initialisé, les éléments qui ne sont pas initialisés reçoivent la valeur 0 du type approprié. [IBM] sup> p>
blockquote> car la longueur a été donnée à 16, le compilateur assurera automatiquement le reste de la matrice (après Contrairement à nos analyses initiales, le noyau Cuda est pas fort>" piquer en octets "à Ajouter 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. P> J'ai ajouté des commentaires au code original (partiel) pour faire cela tout plus clair: p> '\ 0' code> est le ASCII nul code > caractère null em> (code ASCII zéro).
"bonjour" code> 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. P> World! code> à la chaîne existante. Bonjour code> est imprimé en premier. Ensuite, le noyau modifie la chaîne pour être world! Code>, qui est enfin imprimé. P>
@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 b>.
@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 del> code>, je pense que vous devriez supprimer cette partie de réponse.
Ceci est aussi bon que
char Str [16] = "bonjour"; code>@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 code>, 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 Charstr [16] = "Bonjour 123456"; code> serait supérieur, si seulement pour éviter toute imagination sauvage impliquantnul code>,null code> 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"; Code> - Mind the Gap, Erruption Espace.