zeiger auf unterschiedlichen rechnern



  • habe ein programm das bei mir daheim problemlos läuft

    ...
    char sql[512];
    sprintf(sql, "SELECT id FROM tabelle WHERE b=%d", gast");
    erg = db->query(sql); //<- Fehler in dieser Zeile
    ...
    

    bei mir zuhause läuft wie gesagt alles problemlos, auf meinem webserver lässt sich auch alles kompilieren aber beim ausführen hab ich in der zeile in der wieder auf sql zugegriffen wird (auch printf(sql); liefert einen segmentation fault) einen segmentation fault

    sind beides debian systeme

    hoffe mir kann da jemand helfen, danke im voraus



  • Da musst du schon mehr über diese Klasse herzeigen.
    MYSQL-API kennt die Funktion query() nicht also kommt sie aus einer Klasse oder ähnliches.



  • Ja, das ist meine eigene Klasse
    aber selbst

    char sql[512];
    sprintf(sql "...", gast");
    printf(sql);
    

    machst einen fehler in der printf zeile, meine klasse funktioniert ja auch sonst einwandfrei



  • Machst du diese Syntaxfehler eigentlich mit Absicht? Wenn du nicht tippen kannst, mach halt Copy&Paste, aber so können wir nie sicher sein, dass der Code den du postest auch das Problem zeigt.



  • wenn ich diesen syntaxfehler wirklich machen würde könnte ich das projekt ja kaum wie oben beschrieben kompilieren



  • sorry, hatte deinen beitrag nicht richtig gelesen....

    char sql[512];
    
    sprintf(sql, "SELECT besetzt FROM oteams WHERE id=%d", heim);
    
    MYSQL_RES *erg = db->query(sql);
    MYSQL_ROW r=mysql_fetch_row(erg);
    

    Fehler wie gesagt in der Zeile in der auf sql zugegriffen wird, aber auch wenn ich davor ein

    printf(sql);
    

    setze



  • Keine Lösung für dein Problem, aber um einem möglichen Fehler vorzubeugen würde ich snprintf() statt sprintf() verwenden.

    #define SQL_LEN 512
    
    char sql[SQL_LEN];
    
    snprintf(sql, SQL_LEN, "SELECT besetzt FROM oteams WHERE id=%d", heim);
    

    Aufpassen musst du auch, wenn du deinen SQL String mit "%s" zur Laufzeit zusammenbaust. Insbesondere, wenn das Suchkriterium vom User verändert werden kann (bei CGI Programmen z.B. sehr gefährlich).

    Beispiel:

    #define SQL_LEN 512
    
    char sql[SQL_LEN];
    char* name = "'Hugo'; DROP TABLE oteams";  /* <!-- gefährlich ! */
    snprintf(sql, SQL_LEN, "SELECT besetzt FROM oteams WHERE name=%s", name);
    
    printf("%s\n", sql);
    

    Aber auch kann es passieren, dass abhängig vom Suchkriterium dein generierter SQL String mehr Platz benötigt als die bereit gestellten 512 Zeichen. Wenn du dann mit sprintf() statt snprintf() arbeitest, versuchst du auf nicht deklarierten Speicher zuzugreifen. Im Besten Fall erhälst du dann eine Speicherzugriffsverletzung. Im Schlechtesten Fall läuft dein Programm und generiert in bestimmten Situationen nicht das gewünschte Ergebnis.

    Beispiel:

    #define SQL_LEN 512
    
    char sql[SQL_LEN];
    char* name = "'Hugo' AND ort='Entenhausen' AND id > 500;"  /* <!-- gefährlich wenn der resultierende SQL String grösser als die reservierten 512 Zeichen wird */
    snprintf(sql, SQL_LEN, "SELECT besetzt FROM oteams WHERE name=%s", name);
    
    printf("%s\n", sql);
    


  • @Descartes
    aber benutz lieber const anstelle #define 🙂

    const size_t SQL_LEN=512;
    

Anmelden zum Antworten