2015-10-23 9 views
5

Sono uno studente del secondo anno, ancora non abbastanza abile a programmare come vorrei. Stiamo lavorando con OS161 in C quest'anno.Segmentazione su vprintf.c

Per il problema, dovrei scrivere un programma in C che possa assumere il comando come argomenti e richiamarli indietro. Ok nessun problema. L'ho già fatto in altre lingue prima d'ora. Ecco il codice che ho provato:

#include <stdio.h> 

int main (int argc, char *argv[]) { 

    int i = 0; 
    printf("\ncmdline args count=%s", argc); 

    /* First argument is executable name only */ 
    printf("\nexe name=%s", argv[0]); 

    for (i=1; i< argc; i++) { 
     printf("\narg%d=%s", i, argv[i]); 
     } 

    printf("\n"); 
    return 0; 

} 

Questo compila bene con gcc, ma quando l'eseguo, ottengo Segmentation Fault. Corro con gdb, e questo è quello che ottengo:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7abc493 in _IO_vfprintf_internal (s=0x7ffff7dd97a0, format=<value optimized out>, 
    ap=0x7fffffffe3f0) at vfprintf.c:1623 
1623 vfprintf.c: No such file or directory. 
    in vfprintf.c 

Quando ho commentare le istruzioni printf, corre, ma ovviamente poi non va bene quello che ho bisogno di. Per quello che posso dire, sono le affermazioni printf il problema, ma perché? Ho cercato e ho incluso l'intestazione giusta. È difficile per me immaginare che ci sia in realtà qualcosa di sbagliato in vfprintf.c, dal momento che tutto questo si svolge sulla VM della mia scuola in cui mi imbatto. Se qualcuno potesse buttarmi un osso, lo apprezzerei davvero. Grazie!

Modifica, come puoi vedere, ho l'identificatore di conversione errato. Questo era l'intero problema.

+0

mio gcc mi dà un avvertimento sulla linea incriminata. Il tuo no? Cosa succede se si accende '-Wall'? –

+0

@Nate Eldredge Non ho ricevuto alcun avviso. Non avevo familiarità con -Wall, lo userò sicuramente in futuro, grazie. –

risposta

9

argc è un numero intero, ma hai detto a printf di utilizzare il formato %s.

printf("\ncmdline args count=%s", argc); 

Perché hai usato %s, printf tratta il valore di argc come un indirizzo di memoria da cui si tenta di recuperare i caratteri della stringa, che ha provocato l'errore di segmentazione.

cambiare il formato di %d:

printf("\ncmdline args count=%d", argc); 
+0

Aw, cavolo mi sento stupido. Grazie mille! –