frage zu char ** und char *
-
ich versuche mich gerade daran, eine anwendung mit sql db backend zu programmieren. dazu verwende ich sqlite3.
der prototyp einer der funktionen sieht so ausint sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be executed */ sqlite_callback, /* Callback function */ void *, /* 1st argument to callback function */ char **errmsg /* Error msg written here */ );
wenn ich die funktion folgendermaßen aufrufe, dann funktioniert alles ohne probleme:
int db_error; char *db_error_msg; db_error = sqlite3_exec(db_handle, "SELECT * FROM mers_db.mers_characters", NULL, NULL, &db_error_msg);
wenn ich es so mache, bekomme ich einen speicher zugriff fehler in einer funktion der library
int db_error; char **db_error_msg; db_error = sqlite3_exec(db_handle, "SELECT * FROM mers_db.mers_characters", NULL, NULL, db_error_msg);
ich weiß echt nicht wieso. kann mir das bitte jemand erklären?
sebastian
bevor ich's vergesse, die zeile an der der fehler auftritr sieht so aus (wobei pzErrMsg der übergebene db_error_msg pointer ist):
*pzErrMsg = malloc(1+strlen(sqlite3_errmsg(db)));
-
Hallo,
ich verstehe dein Problem nicht. Die Funktion gibt eben ein Zeiger auf ein Char zurück:
char *db_error_msg; // Zeiger auf Char char **db_error_msg; // Zeiger auf Zeiger auf Char
Der Rückgabetyp muss natürlich stimmen. Wenn die Funktion einen Zeiger auf das erste Byte eines Strings erwartet aber dann einen Zeiger bekommt, funktioniert das eben nicht. Warum willst du das überhaupt machen?
-
CarstenJ schrieb:
char *db_error_msg; // Zeiger auf Char char **db_error_msg; // Zeiger auf Zeiger auf Char
Der Rückgabetyp muss natürlich stimmen. Wenn die Funktion einen Zeiger auf das erste Byte eines Strings erwartet aber dann einen Zeiger bekommt, funktioniert das eben nicht. Warum willst du das überhaupt machen?
das ist mir schon alles klar.
aber die funktion erwartet ja einen char **. nur dass ich im ersten fall einen char * definiere und ihn dann referenziert uebergebe, und im 2ten fall definiere ich gleich einen char ** und uebergebe ihn direkt.oder steh ich jetzt total auf der leitung?
sebastian
-
Sollte eigentlich gehen. Bist du sicher, dass der Fehler nicht irgendwo anders ist ?
#include <stdio.h> void func(char **str) { printf("%s\n", *str); } int main() { char *str = "Hallo Leute"; char **str2 = &str; func(str2); return 0; }
läuft einwandfrei
-
sebhofer schrieb:
wenn ich die funktion folgendermaßen aufrufe, dann funktioniert alles ohne probleme:
int db_error; char *db_error_msg; db_error = sqlite3_exec(db_handle, "SELECT * FROM mers_db.mers_characters", NULL, NULL, &db_error_msg);
OK, du übergibst als letztes Argument die Adresse eines existierenden char-Pointers.
wenn ich es so mache, bekomme ich einen speicher zugriff fehler in einer funktion der library
int db_error; char **db_error_msg; db_error = sqlite3_exec(db_handle, "SELECT * FROM mers_db.mers_characters", NULL, NULL, db_error_msg);
Du übergibst einen uninitialisierten Zeiger auf einen char-Zeiger. Dieser zeigt, wie es uninitialisierte Variablen so an sich haben, irgendwo in die Pampa, aber höchstwahrscheinlich nicht auf einen gültigen char-Zeiger. Crash folgt auf dem Fuße.
-
mittlerweile hab ichs auch gecheckt. eigentlich voellig logisch
danke auf jeden fall!sebastian