Chris: Ansi C Programm

Hallo zusammen,

ich versuche eine kleines Ansi C Programm zu schreiben und hänge an einer blöden stelle fest ;-)
Durch den Compiler etc.. geht das Programm einwandfrei durch nur in dieser funktion bleibt er beim ausführen hängen mit der aussage "Segmentation fault" ...

hier die Funktion:

void change_db()
{
   char *db;

printf("\n\nGeben Sie den Datenbanknamen ein: ");
   scanf("%s",db);
   getchar();

mysql_select_db(mysql,db);

printf("READY");
   getchar();
}

Ich hoffe Ihr könnt helfen ;-)

Danke euch ...

Viele Grüße

Chris

  1. kleiner Nachtrag:

    Der Fehler kommt wenn ich die Eingabe bei scanf() gemacht habe und bestätige ...

    Danke euch ...

    Viele Grüße

    Chris

    1. hallo Chris,

      Der Fehler kommt wenn ich die Eingabe bei scanf() gemacht habe und bestätige ...

      Naja, die Frage ist, wie du diese Eingabe an dein Programm übermittelst. Der Codeschnipsel, den du gepostet hast, sieht zumindest auf den ersten Blick korrekt aus. So wie du im "Nachtrag" schreibst, hängt das Ganze, wenn du "%s" übermitteln möchtest. Aber wie du das im restlichen Programm anstellst, hast du nicht angegeben.
      Und: ist dein Programm eine *.exe und läuft unter Windows, oder ist es eine ausführbare Datei auf LINUX/UNIX-Basis?
      Es könnte unter Umständen auch noch irgendwelche logs geben (syslog)

      Grüße aus Berlin

      Christoph S.

      1. Hallo Christoph S.,

        ... wie du das im restlichen Programm anstellst, hast du nicht >>angegeben.

        Unten habe ich die Mainfunktion angehängt, ist eigentlich nur ein kleiner Switch von dem aus es dann zur Funktion change_db(); geht ...

        Das Program ist ein Konsolen Programm und läuft momentan auf meinem Linux Server ...

        Ich denke das das Problem beim einlesen liegt bei "%s", evtl. habe ich einfach den Wert der Variablen oder ähnliches falsch gesetzt ...
        Fehler Mails bekomme ich keine und in den Logs ist auch nichts zu finden ...

        Hier die Mainfunktion:

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

        printf("Baue verbindung zur Datenbank auf ...\n\n");
          verbinden();

        do{
              printf("-1- Datenbank auswaehlen\n");
              printf("-2- Programm beenden\n\n");
              printf("Ihre Auswahl : ");
              scanf("%d",&auswahl);
              getchar();

        switch(auswahl)
                {
                  case 1: change_db();
                          break;
                  case 2: printf("...beende Verbindung zur Datenbank\n");
                          break;
                  default:printf("Falsche Eingabe\n\n");
                }

        }while(auswahl != 2);
             verbindung_schliessen();
             return 0;
        }

        Danke für die Mühen ...

        1. hallo nochmals,

          Das Program ist ein Konsolen Programm und läuft momentan auf meinem Linux Server ...

          Ok. dann gibts ein paar andere Bedenken nicht.

          Ich denke das das Problem beim einlesen liegt bei "%s", evtl. habe ich einfach den Wert der Variablen oder ähnliches falsch gesetzt ...

          Jaein. Slyh hat dir oben ziemlich exakt beschrieben, wo es hängt. Es hätte allerdings sein können, daß du das an anderer Stelle im Gesamtprogramm abfängst, deshalb habe ich nachgefragt.

          Fehler Mails bekomme ich keine und in den Logs ist auch nichts zu finden ...

          Dann solltest du dir dein syslog mal anschauen und eventuell neu konfigurieren ;-)

          Hier die Mainfunktion:

          Ja, danke. Es hätte unter Umständen sein können, daß du im "main" oder an anderer Stelle den benötigten Speicher reservierst. Das ist aber nicht der Fall. Dann gilt das, was Slyh angemerkt hat.

          Grüße aus Berlin

          Christoph S.

          1. hi!

            Fehler Mails bekomme ich keine und in den Logs ist auch nichts
            zu finden ...
            Dann solltest du dir dein syslog mal anschauen und eventuell neu
            konfigurieren ;-)

            Programme, die mit einem Segfault abstürzen, kommen selten dazu, noch
            irgend etwas anderes sinnvolles zu machen, geschweige denn in Logfiles
            zu schreiben. Falls man darüber etwas genaueres herausfinden möchte,
            kann man im core-File nachsehen, falls eines angelegt wurde. Das
            Allerdings nur, wenn man Ahnung von Debuggern hat.

            Hier die Mainfunktion:
            Ja, danke. Es hätte unter Umständen sein können, daß du im "main"
            oder an anderer Stelle den benötigten Speicher reservierst. Das ist
            aber nicht der Fall. Dann gilt das, was Slyh angemerkt hat.

            Das ist absoluter Unfug, wie man leicht an der ursprünglich geposteten
            Funktion gesehen hätte, wenn man C könnte. Offensichtlich hast du
            davon keine Ahnung. Wieso antwortest du dann überhaupt?

            bye, Frank!

            --
            Never argue with an idiot. He will lower you to his level and then
            beat you with experience.
    2. Servus Chris,

      ich hab zwar schon ne ganze Weile nichts mehr mit C gemacht, aber probier diesen Code doch mal aus. Dem Chararray wird dabei Speicherplatz (hier 10 Byte) zugewiesen und dann müßte alles funktionieren. Ich habe zuerst gedacht es liegt daran, daß scanf() eine Adresse erwartet, aber db ist ja schließlich ein Pointer auf char und braucht keinen Adressoperator.
      Ich hoffe ich konnte helfen.

      Grüße Goofy

      int main(void)
      {
         char *db = (char *) malloc(10*sizeof(char));

      printf("\n\nGeben Sie den Datenbanknamen ein: ");

      scanf("%s",db);
         getchar();
         printf("%s",db);

      // mysql_select_db(mysql,db);

      printf("READY");

      }

  2. Hallo,

    Durch den Compiler etc.. geht das Programm einwandfrei durch nur in dieser funktion bleibt er beim ausführen hängen mit der aussage "Segmentation fault" ...

    Und das heißt, daß du in Speicherbereiche schreiben (/lesen) möchtest,
    die dir nicht gehören. Das tritt eigentlich nur dann auf, wenn ein
    Pointer an eine falsche Stelle zeigt.

    void change_db()
    {
       char *db;

    Du erzeugst hier zwar einen Pointer (auf ein Char/Char-Array),
    reservierst aber nirgends Speicher dafür. Auch initialisierst du den
    Pointer nicht, so daß ein undefinierter Wert drin steht. Deshalb wohl
    auch der Segmentation fault. Ich glaub "malloc" ist die Funktion, die
    du suchst.

    printf("\n\nGeben Sie den Datenbanknamen ein: ");
       scanf("%s",db);

    Hier erfolgt dann der Fehler, weil das Programm versucht die Eingabe
    in einen ungültigen Speicherbeich zu schreiben (weil der Pointer
    irgendwo hinzeigt).

    Ich hoffe Ihr könnt helfen ;-)

    Ich habe schon ewig nichts mehr mit C gemacht (und auch nie wirklich
    professionell). Hoffe aber trotzdem, daß ich nicht allzu falsch
    liege...

    Gruß
    Slyh

    --
    Es gibt 10 Arten von Menschen. Solche, die das Binärsystem verstehen, und solche, die es nicht verstehen.
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:} va:} de:] zu:) fl:( ss:) ls:/ js:|