2012-06-28 2 views
1

J'ai un code très simple et lit les caractères des fichiers. Si l'indice y passe de bas en haut, tout fonctionne. Mais, si ça se passe de haut en bas (la ligne commentée), ça me donne le problème de la faute de seg. Quelqu'un pourrait-il expliquer pourquoi cela arrive? Je vous remercie!Erreur de segmentation (core dumped) si l'index itère à l'envers

void read_ct_from_file(unsigned char** ct, const size_t row, const size_t column, FILE* inf) { 
    size_t x, y; 
    for(x = 0; x < row; x++) { 
     for(y = 0; y < column; y++) { 
     //for(y = column - 1; y >= 0; y--) { // iterate from high to low 

       fscanf(inf, "%02x", &ct[x][y]); 
       printf("%02x ", ct[x][y]); 
     } 
     printf("\n"); 
    } 
} 

Répondre

3

size_t est non signé, de sorte que votre boucle après y = 0 continuer avec max_unsigned qui est> = 0.

+0

Je ne comprends pas bien votre explication, pourriez-vous s'il vous plaît expliquer? Donc la boucle continuera après y = 0? ça ira à y = -1? – drdot

+0

Non, pas -1; size_t est un entier non signé, donc jamais négatif. Après y = 0, y est 2^32-1 – Stefan

+0

Pour comprendre le commentaire de Stefan, vous devez comprendre [overflow] (http://en.wikipedia.org/wiki/Integer_overflow). Avec un entier non signé, vous débordez quand vous allez moins de 0. – RustyTheBoyRobot

-1
for(y = column - 1; y > 0; y--) { // iterate from high to low 

essayer avec cela.

+1

Qu'en est-il lorsque l'index y est 0? C'est le dernier élément du tableau. – drdot

+0

ils signifient probablement 'pour (y = colonne; y> 0; y--) ...' et utilisent ensuite 'y - 1' partout. – hroptatyr

0

BTW une bonne façon d'avoir à la fois l'indice de size_t non signé et éviter la sousverse est enveloppant cette construction:

void read_ct_from_file(unsigned char** ct, const size_t row, const size_t column, FILE* inf) { 
    size_t x, y; 
    for(x = 0; x < row; x++) { 
     for (y = column; y-- > 0;) { // iterate from high to low 

       fscanf(inf, "%02x", &ct[x][y]); 
       printf("%02x ", ct[x][y]); 
     } 
     printf("\n"); 
    } 
} 
+0

J'accepte déjà une réponse. Mais merci beaucoup pour les nouveaux conseils! – drdot

Questions connexes