Was ist ein Segmentierungsfehler (Core Dump)? [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von Farzaneh Torkpichlou
Farzaneh Torkpichlou

Ich versuche, ein C-Programm in Linux zu schreiben, das sqrt des Arguments hat, hier ist der Code:

#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;
}

Nachdem ich meine Eingabe an der Eingabeaufforderung “shell>” eingebe, gibt mir gcc den folgenden Fehler:

Segmentation fault (core dumped)

  • en.wikipedia.org/wiki/Core_dump

    – Amir Afghani

    28. Oktober 2013 um 17:48 Uhr

  • falsche Formatzeichenfolge verwendet, die Sie benötigen %fnicht %s

    – Grijesh Chauhan

    28. Oktober 2013 um 17:51 Uhr

  • Versuchen int main(int argc, char *argv[]).

    – Beta

    28. Oktober 2013 um 17:52 Uhr


  • Schalten Sie auch Ihre Compiler-Warnmeldungen ein, sie hätten Ihnen viele Dinge mitgeteilt.

    – Charlie Burns

    28. Oktober 2013 um 17:57 Uhr

Benutzeravatar von Eric Finn
Erich Finn

„Segmentierungsfehler“ bedeutet, dass Sie versucht haben, auf Speicher zuzugreifen, auf den Sie keinen Zugriff haben.

Das erste Problem ist mit Ihren Argumenten von main. Das main Funktion sein soll int main(int argc, char *argv[])und das sollten Sie überprüfen argc vor dem Zugriff mindestens 2 ist argv[1].

Auch da gehst du in a vorbei float zu printf (was übrigens in a umgewandelt wird double beim Übergang zu printf), sollten Sie die verwenden %f Formatbezeichner. Das %s Formatbezeichner ist für Zeichenfolgen ('\0'-terminierte Zeichen-Arrays).

  • Mir wurde beigebracht, dass es sein sollte int main(int argc, char** argv) Anstatt von int main(int argc, char *argv[]). Obwohl die Art und Weise, wie Sie es ausdrücken, korrekt ist, ist ‘char**’ die eigentlich ‘richtige’ Art, dies zu tun, da es einen Zeiger auf einen Zeiger auf ein Zeichen darstellt.

    – Willothy

    13. Juli 2017 um 22:44 Uhr


  • @WillHopkins Der Standard sagt das int main(void) und int main(int argc, char *argv[]) oder Äquivalent sind akzeptabel, wobei die Fußnote nach „Äquivalent“ lautet: „So, int kann durch einen Typedef-Namen ersetzt werden, der als definiert ist intoder die Art von argv kann geschrieben werden als char ** argvund so weiter.“ Also wirklich eine Frage des Stils. (siehe 5.1.2.2.1 Programmstart)

    – Eric Finn

    13. Juli 2017 um 22:52 Uhr


  • Ja, ich dachte nur, ich erwähne es, weil ich das benutze 🙂

    – Willothy

    13. Juli 2017 um 22:54 Uhr

  • Könnten Sie bitte etwas mehr entwickeln “und Sie sollten überprüfen, ob argc mindestens 2 ist, bevor Sie auf argv zugreifen[1]” um mir zu helfen zu verstehen, was es bedeutet? Danke!

    – Ni-Ar

    18. August 2021 um 10:22 Uhr


  • @Ni-Ar argc ist, wie viele Werte enthalten sind argv. Also bevor du irgendwas mit machst argv[1]müssen Sie sicherstellen argc >= 2

    – Eric Finn

    19. August 2021 um 13:34 Uhr

1424360cookie-checkWas ist ein Segmentierungsfehler (Core Dump)? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy