2012-08-24 3 views
1

Je ne comprends pas le comportement inhabituel de cette sortie de code. Il imprime:Raison de cette sortie inhabituelle en C++

hellooo 
monusonuka 
code

est ici:

#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() 
{ 
printf(" hellooo \n"); 
char name[7]="sonuka"; 
char name1[4]={'m','o','n','u'}; 
printf("%s",name1); 
system("pause"); 
return 0; 
} 
+3

Il s'est juste avéré que pour vous, le tableau contenant '{'m', 'o', 'n', 'u'}' était en mémoire avant 'sonuka' (qui se termine avec un '\ 0 'et termine une chaîne). Utiliser le modificateur '% s' fera lire' printf' jusqu'à ce qu'il rencontre le terminateur null (que 'name1' n'a pas comme n'étant pas une chaîne de style C. – birryree

+2

5 réponses en 4 secondes ... c'est goota être un –

+1

@LuchianGrigore où est la vôtre? :) – ouah

Répondre

3

name1doit être NULL terminé, sinon printf imprimera autant d'octets, comme trouver, jusqu'à frapper le \0.

Il doit être

char name1[5]={'m','o','n','u', '\0'}; 

Qu'est-ce que vous avez est un comportement non défini : mémoire printf imprime après la mémoire, allouée pour name1.

Dans ce cas, il semble que votre compilateur a placé la mémoire pour name après name1, c'est la raison pour laquelle ils sont tous deux imprimés (name est correctement NULL à terminaison, comme tous les littéraux sont).

6

Votre tableau name1 ne se termine pas par un caractère nul ('\0'). La fonction printf imprime des caractères jusqu'à ce qu'elle trouve un zéro. Dans votre cas, il dépasse la fin du tableau. Qu'est-ce qui se passe est undefined comportement. Un résultat probable est que d'autres variables ou ordures sont imprimées à l'écran jusqu'à ce qu'un autre \0 quelque part dans la mémoire soit frappé, mais tout peut arriver, y compris l'écrasement de votre programme.

1

name1 La terminaison printf ne se termine pas par un caractère nul, de sorte que printf conserve uniquement les caractères d'impression jusqu'à ce qu'un \0 soit atteint.

1
printf("%s",name1); 

spécificateur de conversion s nécessite l'argument d'être un pointeur sur une chaîne C.

char name1[4]={'m','o','n','u'}; 

n'est pas une chaîne C car le tableau n'est pas terminé par un caractère nul. La violation de l'exigence du speicier de conversion appelle un comportement indéfini et c'est pourquoi vous obtenez ce résultat inattendu.

+0

Pourquoi cette réponse est-elle downvoted, merci d'expliquer. – ouah

0

Vous essayez d'imprimer un tableau de caractères en tant que chaîne avec printf. Essayez ce code:

int pointer=0; 
while(pointer < 4){ 
    printf("%c",name1[pointer]); 
    pointer++; 
} 
Questions connexes