8
votes

Chaîne terminée null en c

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. XXX


1 commentaires

Notez que si vous déclarez CHARN [257], l'index va de 0 à 256.


5 Réponses :


5
votes

chaîne littéraux tels que "bonjour world!" sont résiliés null, mais char ne sont pas automatiquement terminés null.

Le principe général que j'ai toujours pris est d'être très prudent et d'assigner '\ 0' à 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.


5 commentaires

C'est \ 0 (nul), pas null .


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 peut être défini comme ((vide * ) 0) . Dans tous les cas, ce sont des concepts différents qui ne doivent pas être confondrés.


@larsmans - ah, oui, null peut être un 0 couler sur un vide * 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".



2
votes

Une chaîne littérale comme "foo \ nbar" est toujours traduit par un const charme littéral [] avec un octet zéro supplémentaire à la fin. (La constante aurait donc 8 octets, le premier étant F et le dernier étant zéro).

Mais vous avez raison de forcer explicitement le dernier octet à 0 après un Strncpy .

Et comme Aurelio de Rosa a fait remarquer, le dernier index correct est 256 pour un tableau [257] .


0 commentaires

2
votes

Oui, vous devez le faire. Toutes les fonctions ne mettent pas le caractère NULL pour vous et Strncpy , comme je peux lire dans sa page d'homme, nécessite d'avoir un octet nul parmi les premiers caractères de SRC.


1 commentaires

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.



1
votes

Est-ce absolument nécessaire? non , car lorsque vous appelez scanf , strcpy (sauf pour strncpy 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 , 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 .

Au fait, si vous accédez / écriture sur string1 [257] , cela sera hors de liaison car vous accédez / écrit 258e élément dans un tableau de la taille 257. (Son index à 0)


2 commentaires

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.



1
votes

Soyez toujours prudent d'allouer suffisamment de mémoire avec des chaînes, comparez les effets des lignes de code suivantes:

s1[3] = '\0';


0 commentaires