2017-02-22 1 views
-1
#include <stdio.h> 

int main(void) { 
    int n,i; 
    int str[n]; 

    scanf("%d\n",&n); 
    for(i=0;i<=n;i++) 
    { 
     scanf("%d",&str[i]); 
     printf("%d th %d\n",i,n); 
    } 
    return 0; 
} 

entrée:Pourquoi la septième variable 6 est-elle dans mon programme?

10 

8 9 2 1 4 10 7 6 8 7 

sortie:

0 th 10 

1 th 10 

2 th 10 

3 th 10 

4 th 10 

5 th 10 

6 th 10 

7 th 6 

Pourquoi est-6 dans la sortie?

+1

C est un langage de programmation impératif, non déclaratif. Cela signifie en gros que votre programme est exécuté ligne par ligne. Vous ne pouvez pas déclarer un tableau qui mettra automatiquement à jour sa taille quand 'n' change, vous ne pouvez déclarer qu'un tableau dont la taille est dans' n' ** au moment de la déclaration **. – StoryTeller

+0

La question est (i) bien écrite, (ii) contient un court code compilable, (iii) documente la sortie réelle, (iv) documente la sortie attendue. Et deux utilisateurs établis ont soumis de bonnes réponses, ce qui ajoute plus de crédibilité à la question. Alors pourquoi la downvote? – Bathsheba

+1

@Bathsheba peut-être parce que c'est une question qui montre qu'il n'a pas obtenu un "concept de base" de C et donc c'est une mauvaise question et il est une mauvaise personne;) –

Répondre

2

Dans votre code

int n,i; 
int str[n]; 

vous utilisez n alors qu'il a une valeur indéterminée, non initialisées. Il appelle undefined behavior.

Pour élaborer, n étant une variable locale automatique, sauf si initialisée explicitement, contient une valeur indéterminée.

Solution: Vous devez définir int str[n];après vous a pris la valeur de l'utilisateur (et aseptisé). Après cela, il y a encore une fois le problème, votre boucle s'exécute au cas par cas pour le tableau. C utilise l'indexation de tableau 0, donc, pour un tableau de taille n, les index valides seront 0 à n-1. Votre construction de boucle doit être

for(i=0; i<n; i++) 
4

Ceci est un code vraiment étrange avec un comportement indéfini. Qu'attendez-vous de ceci:

int n; // No value! 
int str[n]; 

A faire? Vous obtenez un tableau dont la longueur est inconnue car n n'a aucune valeur au moment de la déclaration str.

Si vous attendiez le compilateur « temps Voyage » retour à la str[n] ligne comme par magie quand n est donnée une valeur par scanf(), alors ... ce n'est pas comment Co fonctionne, et vous devriez vraiment lire sur l'une des langues un peu plus. Et compiler avec tous les avertissements que vous pouvez obtenir de votre environnement.

Comme un détail supplémentaire, même si elle était fixée de telle sorte que n avait une valeur, la boucle fordépassements le tableau et vous donne un comportement non défini à nouveau.

Pour un tableau de taille m, l'en-tête de la boucle doit lire

for (size_t i = 0; i < m; ++i) 

Depuis l'indexation est basé sur 0, vous ne pouvez pas index à m, qui est en dehors du tableau.

+0

Il est intéressant de pouvoir concevoir cette propriété "voyage dans le temps" en utilisant des acteurs en C++. Belle réponse au passage. – Bathsheba

0

La valeur de la taille de la chaîne str [] n'est pas encore définie. Vous devez avoir initialisé cette valeur avant de déclarer une chaîne/tableau.

Si vous utilisez gcc pour compiler, essayez d'inclure l'indicateur -Wall dans votre ligne de compilation pour détecter les erreurs de ce type.