J'ai réécrit la fonction appeler la fonction à l'aide du code ci-dessous produit un nombre ridiculement élevé. 6356735 P> strallen () code> de la fonction #include <stdio.h>
#include <string.h>
size_t my_strlen(const char *s);
int main(void) {
const char str[] = "abcd";
printf("length of abcd: %d\n", my_strlen(str));
}
size_t my_strlen(const char *s) {
const char *p = s;
while (*s)
s++;
return s;
}
3 Réponses :
p code> pointe vers le début de la chaîne, mais c'est un pointeur et non un index. Il ne sera jamais zéro car c'est ce qui est utilisé lorsque malloc () code> échoue pour allouer la mémoire. p>
Ici, vous retournez la chaîne (un pointeur sur . Faites ceci (soustrayez le fin de la chaîne depuis le début): p> Les cordes ne sont pas stockées à zéro, elles sont stockées dans un endroit en mémoire (quelque part qui n'est pas zéro et dépend sur l'environnement). P> Par exemple, prenez ceci: char code>) au lieu de la longueur de la chaîne: Char * P1 = "helloworld"; Char * p2 = "Au revoir"; p1 = p2 + 5; code>. p1 code> ne pointe pas sur World code> à la fin de cela, il pointe sur ye code>. p> p>
Les pointeurs sont déroutants. p>
L'exemple que vous avez fourni affiche la valeur de l'adresse L'opérateur Comme exemple, laissez p pointe du début de la chaîne p>
blockQuote>
oui. strong> Il pointe d'une adresse Soustraire Comment cela fonctionne-t-il en particulier? P>
blockQuote>
Nous avons découvert que REMARQUE: Les chaînes de style C sont Vous pouvez jouer un peu avec http://pythontutor.com/c.html#mode = Modifier afin de mieux comprendre les pointeurs. P> s code> points. La valeur est "aléatoire". P>
++ code> (préprément avant et post) d'un pointeur de caractère déplace un pointeur Tailleof (char) code> octets à droite (c.-à-d. Déplace le pointeur sur le Next Char). P>
char * p code> point sur une adresse mémoire 123. Si nous l'incrédus (c.-à-d. p ++ code>), il serait indiqué à l'adresse de la mémoire 123 + taille de taille (char) code> (Sommation à 124). P>
p code> à partir de s code> doit être identique au s code> p>
blockQuote>
s code> est incrémenté n code> fois. Un incrément est l'ajout Tailleof (Char) code> à un pointeur de caractère. Pour cette raison, s code> devient p + n * taille de (caractère) code>. p + n * Taille de (caractère) code> est égal à p code> si n code> est zéro. p>
s code> est p + n * taille de (caractère) code>. L'opération s - p code> peut être étendue comme ((P + N * Tailleofof (char)) - p) / taille de caractère de (caractère) code>, qui est n < / code> - la taille de la chaîne. p>
\ 0 code> terminés. \ 0 code> est interprété comme false code>, et il termine le pendant code> en boucle à la fin d'une chaîne. P>
La valeur n'est pas "aléatoire", elle n'est pas spécifiée, c'est-à-dire n'existe pas. Vous pensez peut-être que vous pouvez l'observer, mais toute tentative de le faire a un comportement indéfini, alors non vous ne pouvez pas! Ne vous inquiétez pas: c'est une idée fausse commune.
Votre compilateur vous a-t-il vraiment donné aucune erreur ni avertissement? Si c'est le cas, ne les ignorez pas. Si ce n'est pas le cas, trouvez comment obtenir votre compilateur pour vous donner plus d'aide ou de passer à un meilleur compilateur.
retour S; code> renvoie l'adresse non de la longueur et vous imprimez de la même manière. Compiler doit avoir averti la même chose.Retour S-P; CODE> est correct car il renvoie entier et c'est ce qui est attendu.Je suis toujours confus: lorsque la boucle tandis que la boucle se termine, s pointe sur la place dans la chaîne où le caractère null est et p pointe des points à S (ou S [0]), donc n'est donc pas
s - p code > La même chose que i-0 où je suis l'index de l'endroit où le caractère nul est stocké, ce qui est fondamentalement je?@Shuster n ° Les cordes ne sont pas stockées à zéro, elles sont stockées dans un pointeur à un emplacement en mémoire (quelque part au-dessus de zéro). Au lieu de cela, prenez la différence entre les deux.
Par exemple, prenez ceci:
char * p1 = "helloworld"; Char * p2 = "Au revoir"; p1 = p2 + 5; code>.P1 code> n'est pasWorld code> à la fin de cela, c'estye code>.Une chose à noter est que le résultat de
s - p code> est de typeptrdiff_t code> qui est signé i> et le résultat n'est défini que si la valeur est représentable. Un code strictement correct n'utiliserait pas de soustraction, mais un index d'exécutionTaille_T CODE>.Notez également "my_strlen" sera nettement plus lent que la normale
Strlen code> pour les chaînes de plus de 64 caractères. LeStrlen code> compare 4 octets per-itération. Vous pouvez faire quelque chose de similaire en casting ànon signé code> et en comparant chacun des quatre octets par itération.