2010-03-24 2 views
0

Salut, j'ai fait cette fonction qui est faite pour répliquer une erreur que je ne peux pas franchir. Il ressemble à ceci:La boucle avec l'arithmétique du pointeur refuse de rester à l'intérieur de la limite en C. Donne-moi segfault

void enumerate(double *c, int size){ 
    while(c < &c[size]){ 
      printf("%lf\n", *c); 
      c++; 
    } 

}

J'ai ajouté quelques années printf là-bas et il me donne:

Adressof c: 0x100100080, Adressof c + size: 0x1001000a8 

Je puis imprimer aussi l'adresse de c pour chaque itération de la boucle , il atteint 0x1001000a8 mais continue après ce point même si la condition doit être fausse autant que je peux dire jusqu'à ce que je reçoive une erreur de segmentation. Si quelqu'un peut repérer le problème, s'il vous plaît dites-moi, je regarde cela depuis un moment maintenant.

Merci.

Répondre

4

Le problème est la condition de vérifier lui-même ....

while(c < &c[size]) 

Withing la boucle pendant que vous incrémentez c.

Donc les deux c et &c[size] continueront d'être incrémentés, puisque la deuxième adresse est relative à la valeur actuelle de c.

Une meilleure façon serait:

void enumerate(double *c, int size){ 
    double *ptr = c; 
    while(c < &ptr[size]){ 
      printf("%lf\n", *c); 
      c++; 
    } 
} 
+0

Oui! C'est évident maintenant, ha. Je vous remercie. – Fred

5

Vous utilisez la valeur actuelle de c des deux côtés de votre condition de boucle, et vous augmentez c chaque itération. c n'atteindra jamais l'adresse de lui-même plus rien. Enregistrez l'adresse de c[size] avant d'entrer dans la boucle, et vous finirez par l'atteindre.

void enumerate(double *c, int size) { 
    double *addr = &c[size]; 
    while(c < addr) { 
      printf("%lf\n", *c); 
      c++; 
    } 
} 
+0

Merci, je peux le voir maintenant. – Fred

0

Chaque fois que vous atteignez c++, la valeur de &c[size] change également. Donc, la condition est toujours vraie.

Questions connexes