Wieso kann ich dass nicht Compilieren?



  • Hi, wieso kann ich folgendes nicht Compilieren

    #include <mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int mai()
    {
                    MYSQL  *my;
    
                     mysql_init(my);
    
                    if(my==0)
                    {
                            printf("Error: Can't Init MYSQL\n");
                    }
    
                    printf("Verbindung zum MYSQL Server erstellen\n:");
    
                    if(mysql_real_connect(my,"192.168.2.100","root","","money",0,NULL,0))
                    {
                            printf("Error, Cant't Connect to Databese.\n");
                    }
                    else
                    {
                            printf("Erfolgreich mit der Datenbank verbunden..\n.");
                    }
    
                    mysql_close(my);
    
    }
    

    Hier die Ausgaben beim Complieren:

    blackzero@omega:~/Desktop/Linux Programmierung/mysql$ gcc -c -I/usr/include/mysql main.c
    main.c:34:3: warning: no newline at end of file
    blackzero@omega:~/Desktop/Linux Programmierung/mysql$ gcc -o mysql1 main.o -L/usr/lib/mysql -lmysqlclient
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
    (.text+0x18): undefined reference to `main'
    collect2: ld gab 1 als Ende-Status zurück
    blackzero@omega:~/Desktop/Linux Programmierung/mysql$
    

    Gruss CompComp



  • Ok, ganz übersehen, dass main mai hiess :=)

    Jetzt konnt ich es Compilieren :=)

    Aber wenn ich es aussführen will kommt folgendes:

    blackzero@omega:~/Desktop/Linux Programmierung/mysql$ ./mysql1
    Segmentation fault (core dumped)
    


  • Hallo,

    reserviert mysql_init Speicher fuer my?

    gruss
    v R



  • MYSQL  *my;
    
    mysql_init(my);
    

    das ist vermutlich nicht richtig, da my nicht vernünftig initialisiert wird. Schreib mal

    MYSQL *my = NULL;
    
    mysql_init(my);
    

    und du wirst es sehen

    btw. lies Compiler-Meldungen und versuch sie zu verstehen. Damit dir nicht wieder so was peinliches passiert! 👎



  • Das Problem ist, dass Du einen nicht initialisierten Zeiger by-value an eine Funktion mysql_init übergibst, die dort vermutlich einige Dinge initialisieren soll. Aber die Funktion greift a) in ungültigen Speicher (weil der Zeiger auf nichts zeigt), hat aber b) auch keine Möglichkeit, den Zeiger selbst zu ändern (wegen by-value Übergabe). Es steht also nach dem Aufruf ohnehin nichts anderes drin als vor dem Aufruf (und da Du nicht sichergestellt hast, dass 0 drin steht, würde die if-Abfrage keine verwertbaren Ergebnisse liefern).

    Du musst der Funktion einen NULL-Zeiger übergeben und den Rückgabewert auffangen, damit das klappt (alternativ kannst Du einen Zeiger auf ein lokales Objekt übergeben und den Rückgabewert als Fehlerindikator auswerten):

    MYSQL* my = mysql_init(0);
    if (my == 0) // fehler
    
    // Alternativ:
    MYSQL my;
    if (mysql_init(&my) == 0) // fehler
    

Anmelden zum Antworten