Je suis assez anxieux pour les cordes de C. Dois-je mettre le dernier char \ 0 ou cela le fait par elle-même? Si je ne le fais pas manuellement, alors que j'essaie de déboguer du code et quand j'accède à String1 [257], ce n'est pas null. J'ai des problèmes avec la libération de la mémoire allouée d'un tableau de cordes, donc je pensais que c'était une raison.
5 Réponses :
chaîne littéraux tels que Le principe général que j'ai toujours pris est d'être très prudent et d'assigner "bonjour world!" code> sont résiliés null, mais
char code> ne sont pas automatiquement terminés null. p>
'\ 0' code> à la fin de la chaîne sauf si cela provoque un problème de performance. Dans ces cas, je suis très attentif à propos des fonctions de bibliothèque que j'utilise. P>
C'est \ 0 code> (nul), pas
null code>.
Et pourtant, NULL, 0 et '\ 0' ont des significations distinctes. Pas besoin de les confondre simplement parce qu'une langue conçue il y a 30 ans vous permet de.
Pas nécessairement, null code> peut être défini comme
((vide * ) 0) code>
. Dans tous les cas, ce sont des concepts différents qui ne doivent pas être confondrés.
@larsmans - ah, oui, null code> peut être un
0 code> couler sur un
vide * code> afin qu'il ne fonctionne pas.
La déclaration sur les tableaux dépend de la manière dont il est initialisé. Considérons Char Str [4] = "Test" VS Char Str [] = "Test".
Une chaîne littérale comme Mais vous avez raison de forcer explicitement le dernier octet à 0 après un Et comme Aurelio de Rosa a fait remarquer, le dernier index correct est 256 pour un tableau "foo \ nbar" code> est toujours traduit par un
const charme littéral [] code> avec un octet zéro supplémentaire à la fin. (La constante aurait donc 8 octets, le premier étant
F code> et le dernier étant zéro). P>
Strncpy code>. p>
[257] code>. P>
Oui, vous devez le faire. Toutes les fonctions ne mettent pas le caractère NULL pour vous et Strncpy CODE>, comme je peux lire dans sa page d'homme, nécessite d'avoir un octet nul parmi les premiers caractères de SRC. P>
Strncpy est une fonction plutôt "spéciale" avec une sémantique spéciale. Habituellement, ce n'est pas ce que les gens veulent quand ils ne font que copier des chaînes, malheureusement.
Est-ce absolument nécessaire? non fort>, car lorsque vous appelez Au fait, si vous accédez / écriture sur scanf code>,
strcpy code> (sauf pour
strncpy code> où vous devez mettre manuellement zéro si elle dépasse la taille), il copie le terminateur null pour vous. Est-ce bon de le faire de toute façon? pas vraiment strong>, cela n'en aide pas vraiment le problème de BufferOverflow, car cette fonction passera de la taille du tampon de toute façon. Alors quelle est la meilleure façon? Utilisez C ++ avec
std :: chaîne code>. p>
string1 [257] code>, cela sera hors de liaison car vous accédez / écrit 258e em> élément dans un tableau de la taille 257. (Son index à 0) P>
Strncpy peut ne pas copier le terminateur null. Voir Stackoverflow.com/Questtions/1453876/...
Oh. Cela a un sens à l'accès à l'accès au 258ème élément. Merci Monsieur.
Soyez toujours prudent d'allouer suffisamment de mémoire avec des chaînes, comparez les effets des lignes de code suivantes:
s1[3] = '\0';
Notez que si vous déclarez CHARN [257], l'index va de 0 à 256.