Speicherzugriffsfehler



  • Hallo,
    ich soll als Aufgabe ein C-Programm schreiben, dass ∑1/n! von n=0 nis nmax berechnet.

    hab folgendes dazu geschrieben:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    double Summand(int n){
      double ergebnis2;
      int i;
      ergebnis2=1;
      for(i=1;i<=n;i++){
        ergebnis2=ergebnis2*1.0/i;
       }
      return ergebnis2;
    }
    
    int main(int argc, char *argv[]){
      int n;
      double ergebnis;
      ergebnis=1;
      for(n=1;n<=atoi(argv[1]);n++)
        {
          ergebnis=ergebnis+Summand(n);
          printf("%.6lf \n",ergebnis);
    }
      printf("Gesamtergebnis %lf \n",ergebnis);
      return 0;
    }
    

    so, dass mit gcc lompiliert und dann ausgeführt. Kriege dann aber Speicherzugriffsfehler. Was ist falsch?



  • Vermutlich ist argc == 1.



  • Ich kann den Fehler bei mir nicht nachvollziehen, wenn ein Argument angegeben wird (so dass argv[1] != NULL ist). Rufst du das Programm ohne Kommandozeilenparameter auf?

    Außerdem ist streng genommen %lf in C90 nicht definiert; der richtige Format-Spezifikator für double ist %f. Allerdings machen die meisten Laufzeitbibliotheken dabei trotzdem das, was du meinst, und in C99 (welches von MSVC bis heute nicht unterstützt wird) sind %f und %lf synonym. Wenn du keinen exotischen und alten Compiler benutzt, wird das wohl nicht das Problem verursachen.



  • ah, ich idiot. Ich hab den Wert in der Kommandozeile immer in Klammern eingegeben.
    Sorry. Problem erledigt



  • for(n=1;n<=atoi(argv[1]);n++)
    

    Wenn der Compiler hier nicht schlau ist, dann muss er jeden Durchlauf den String neu in ein Integer konvertieren. Compilerabhängig, ob er atoi kennt.



  • Auch wenn das Programm relativ simpel ist und dir wahrscheinlich nur zu Lernzwecken dient, sollte dir bewusst sein, dass es verdammt gefährlich ist, die Anzahl der Argumente (argc) nicht zu überprüfen, bevor auf argv zugreifst...


Anmelden zum Antworten