2010-12-04 12 views
3

J'ai déclaré un tableau de longueur N (supposé). Maintenant, j'attribue des valeurs aux éléments de ce tableau en utilisant une boucle (la variable loop est utilisée comme index du tableau). Le code est comme suit:La variable de boucle d'index de tableau est remise à zéro dans C, C++

int main() 
{ 
    int arr[4], j; 
    for(j=0; j<10; j++) 
    {  
    printf("%d\n", j); 
    arr[j] = 0; 
    sleep(1); 
    printf("%d\n\n", j); 
    } 
return 0; 
} 

Je pensais que la sortie soit 0 1 2 .. 9. Mais ce qui est arrivé est que j obtenu remis à 0 lorsque l'affectation arr [N + 2] = 0 (arr [ 6] = 0, dans ce cas) a été exécuté dans la boucle. Qu'est-ce qui se passe réellement ici? Est-ce que je manque quelque chose?

Répondre

8

Votre tableau a 4 éléments et votre index est hors de portée, donc vous ne faites que piétiner la mémoire.

Vu le code ici, je pense arr[4] pour réinitialiser le tableau, mais puisque vous avez mentionné qu'il est d'une longueur N et N+2 est ce qu'il provoque, il pourrait y avoir un rembourrage dans votre pile. Dans tous les cas, lorsque vous déclarez le tableau et j, ils sont placés dans la pile. Dans votre cas, j est dans une position telle que lorsque votre index est hors limites, vous accédez à la mémoire où j est.

+0

Que voulez-vous dire par piétinement ici? – nitzs

+0

Vous l'avez maintenant. Merci. – nitzs

+0

J'ai mis à jour la réponse. Fondamentalement, arr [N] est la même chose que d'ajouter N au pointeur au début du tableau et de déréférencer la mémoire. Il ne se soucie pas si la longueur de l'arr est plus petite - c'est à vous de vérifier. Dès que vous affectez un élément de tableau hors limites, vous écrasez la mémoire - tous les paris sont désactivés maintenant. Le programme peut s'écraser, lancer des missiles, réinitialiser j, augmenter les niveaux de rayonnement, faire tourner des centrifugeuses hors de contrôle, etc. –

3

le comportement du code est indéfini car il a un bug. arr a une taille de 4 mais vous indexez cette taille avec j

2

Votre tableau déborde. Vous l'avez défini comme ceci avec 4 éléments:

int arr[4] 

Mais vous essayez d'affecter 10 éléments.

j est apparemment situé immédiatement après le tableau, donc lorsque vous affectez arr[6] = 0, vous effacez j.

+0

Ce sera mon cas. Je ne connais pas la dynamique du compilateur ou du langage, mais si je devais deviner, je supposerais que J serait créé dans le premier emplacement mémoire après le tableau, ce qui signifierait que lorsque vous écrivez à arr [4] vous pourriez être fini écrit j. – Nicholas

+0

Mais n'est-il pas légal de déréférencer le premier emplacement de mémoire au-delà du dernier élément du tableau? Je veux dire que cet endroit est réservé, n'est-ce pas? – nitzs

+1

"Illégal" signifie que si vous brisez votre côté du contrat, le compilateur n'est plus obligé de faire votre offre. Il devient son propre maître et les démons possèdent vos narines. –

Questions connexes