Address 0x5 out of bounds

di il
2 risposte

Address 0x5 out of bounds

Ciao a tutti,
nuovo esercizio del libro Deitel e nuovo problema che va oltre la mia comprensione.
Questo è il codice (mancano ancora 2 funzioni ma non è rilevante)

#include <stdio.h>

void printResults(const char *[], int [][10]);

int main(void){

   const char * questions [5]={"Energy sources and Earth pollution", 
                               "Democracy, freedom and progress", 
                               "Technology, culture and human knowdledge", 
                               "Animal exploitation and meat overproduction", 
                               "Global Governance"};
   int answers[5][10];
   int user;
   int countQ;
   
   system("clear");

   
   for(user=1;user<=10;user++){
      printf("User %d,Please rate the following issues from 1 (not important) to 10 (most important):\n\n"
             ,user);   
      for (countQ=0;countQ<5;countQ++){
         printf("\n%s:",questions[countQ]);
         scanf("%d", &answers[countQ][user]);
      }
      printf("\nThank you for your cooperation!\n");   
   }
   
   printResults( questions, answers);
  /* printBest(questions, answers);
   printWorse(questions, answers); */
   return 0;
}
   
void printResults(const char *items[], int rates[][10]){

   int r,c;
   int average[5];
   int parTotal;

   printf("\n                                            1 - 2 - "
          "3 - 4 - 5 - 6 - 7 - 8"
          " - 9 - 10 - Average \n\n");
   for (r=0; r<5;r++){
      printf("\n%44s: ", items[r]);
      parTotal=0;
      for(c=0;c<10;c++){
         printf("%4d", rates[r][c]);
         parTotal+=rates[r][c];
      }
      average[r]=parTotal/10;
      printf ("%4d", average[r]);
   }
   printf("\n\n");
}
il problema è che mi da segfault (SIGSEGV) alla chiamata della funzione printResults. Più precisamente, con gdb all'istruzione printf("\n%44s: ",items[r]) se controllo le variabili mi da giustamente r=0 ma items[r] mi dice 0x5 <Address 0x5 out of bounds>.
A me l'istruzione sembra uguale a quella della main, printf("\n%s:",questions[countQ]), entrambe si riferiscono allo stesso vettore di puntatori e quando compilo non mi da nè errori ne warnings. cosa c'è che non va? grazie anticipate

ps non sono sicuro che il resto della funzione printResults sia corretto in quanto non ho ancora avuto modo di testarlo per via del segfault,comunque se riesco a proseguire poi vedo di correggere eventuali errori autonomamente.
pps a proposito per curiosità con gdb è possibile assegnare manualmente un valore ad una variabile in fase di debugging? sarebbe utile nel mio caso per proseguire con l'esecuzione per testare altri eventuali problemi.

2 Risposte

  • Re: Address 0x5 out of bounds

    Errore:
    
    scanf("%d", &answers[countQ][user]);
    
    correzione:
    
    scanf("%d", &answers[countQ][user-1]);
    
    user va da 1 a 10 e l'array da 0 a 9.
  • Re: Address 0x5 out of bounds

    Cavolo hai ragione, questa volta è un puro errore di distrazione e ci sarei dovuto arrivare da solo. In realtà mi concentravo sulle istruzioni printf e sul vettore di puntatori e non avevo pensato che un errore nell'altro vettore mi andasse a danneggiare le altre locazioni di memoria tra cui quella di items[0], tramite un inesistente answers[countQ][10] (se ho capito bene la causa dell'errore).

    for(x=0;x<1;x--){
    printf("grazie skynet");
    }
Devi accedere o registrarti per scrivere nel forum
2 risposte