2013-10-28 15 views
60

Sto cercando di scrivere un programma C in Linux che avere sqrt dell'argomento, Ecco il codice:qual è l'errore di segmentazione (core dumped)?

#include<stdlib.h> 
#include<stdio.h> 
#include<math.h> 

int main(char *argv[]){ 
    float k; 
    printf("this is consumer\n"); 
    k=(float)sqrt(atoi(argv[1])); 
    printf("%s\n",k); 
    return 0; 
} 

Dopo digito il mio ingresso al "guscio>" prompt gcc mi dà il seguente errore :

Segmentation fault (core dumped) 
+0

http://en.wikipedia.org/wiki/Core_dump –

+4

stringa di formato errata utilizzata è necessario '% f', non'% s' –

+1

Provare 'int main (int argc, char * argv [])'. – Beta

risposta

86

"Errore di segmentazione" indica che si è tentato di accedere alla memoria a cui non si ha accesso.

Il primo problema riguarda gli argomenti di main. La funzione main dovrebbe essere int main(int argc, char *argv[]) e si dovrebbe verificare che argc sia almeno 2 prima di accedere a argv[1].

Inoltre, dato che si sta passando un float a printf (che, tra l'altro, viene convertito in un double caso di passaggio da printf), è necessario utilizzare il formato %f specificatore. L'identificatore di formato %s è per stringhe ('\0' -macchine di caratteri terminati).

+1

grazie mille: - * :) – user2929110

+0

Mi è stato insegnato che dovrebbe essere 'int main (int argc, char ** argv)' invece di 'int main (int argc, char * argv [])'. Anche se il modo in cui lo metti è corretto, 'char \ * \ *' è il vero modo 'corretto' di farlo perché rappresenta un puntatore a un puntatore a un personaggio. –

+2

@WillHopkins Lo standard dice che 'int main (void)' e 'int main (int argc, char * argv [])' o equivalente sono accettabili, con la nota dopo "equivalente" che dice "Così,' int' può essere sostituito da un nome typedef definito come 'int', o il tipo di' argv' può essere scritto come 'char ** argv', e così via." Quindi, davvero, è una questione di stile. (vedere 5.1.2.2.1 Avvio del programma) –

Problemi correlati