2017-10-17 2 views
-1

J'étudie pour mon test et je suis tombé sur un code décent avec des résultats bizarres. Je comprends le résultat des deux premières lignes dans main(), mais je ne comprends pas pourquoi mon ordinateur imprime la réponse comme l'image !!Pourquoi le dernier code renvoie-t-il un tel résultat? (en C)

Que fait s [% d] là ??? result of the code

#include <stdio.h> 

void printstring(char s[]) { 
    int i; 

    for (i = 0; i < 10; i++) 
     printf(" s[%d]", i); 
    printf("\n"); 

    for (i = 0; i < 10; i++) 
     printf("%5c", s[i]); 
    printf("\n"); 

    for (i = 0; i < 10; i++) 
     printf("%5X", s[i]); 
    printf("\n"); 
    printf("\n"); 
} 

main() { 
    printstring("I am beautiful"); 
    printstring("beautiful"); 
    printstring(""); 
} 
+4

Vous appelez * undefined behaviour * en accédant à la longueur réelle de la chaîne – UnholySheep

+0

Je suis complètement nouveau à C donc je ne suis pas sûr de savoir pourquoi c'est un comportement indéfini. –

+2

Combien y a-t-il de caractères dans '" beautiful "'? Combien dans '" "'? Que pensez-vous qu'il se passe quand vous sortez des limites d'un tableau (et que les littéraux * sont des tableaux)? –

Répondre

1

car les tableaux en C/C++ n'a pas de limite explicite, dans le troisième appel de printstring, le réseau s est un tableau de caractères de longueur nulle. Lorsque la valeur de déréférence utilise l'indice 0..10, elle fait référence à un stockage aléatoire en mémoire dont la valeur dépend du compilateur et de la structure du fichier objet généré. et dans votre cas, la chaîne "s [% d]" est juste à l'endroit 3 octets après s se réfère.