SpecialAgentUwe Geschrieben 9. September 2010 Geschrieben 9. September 2010 Hallo alle zusammen, ich schreibe derzeit ein Programm, für das ich Stoppwörter aus einer SQLite Datenbanktabelle brauche. Diese hole ich mir per SQL Statement und möchte diese dann in ein globales Array schreiben. Jedoch werden die Ergebnisse bei jedem Aufruf von sqlite3_step natürlich wieder ungültig. Und auch wenn ich die Werte mit strcpy kopiere bleiben sie nicht persistent erhalten. Hier nochmal mein Codeabschnitt. char *arr[100]; int main(void) { char *name = "metadata-common.db3"; sqlite3 *db; char *stmtText = "SELECT name FROM stopwords WHERE art = 'refix';"; sqlite3_open(name, &db); int listCount = 0; int retval; sqlite3_stmt *stmt; retval = sqlite3_prepare_v2(db, stmtText, -1, &stmt, 0); while(1) { retval = sqlite3_step(stmt); if(retval == SQLITE_ROW) { const char *result = (const char*)sqlite3_column_text(stmt,0); char temp[strlen(result)]; strcpy(temp, result); arr[listCount++] = temp; } else if(retval == SQLITE_DONE) { break; } } sqlite3_finalize(stmt); sqlite3_close(db); return 0; } Habe es auch schon mit malloc() versucht, jedoch ist dann irgendwann der Speicher voll und das Programm schmiert ab. Bin noch blutiger Anfänger in C und wäre dankbar für Hilfe. Gruß Zitieren
Klotzkopp Geschrieben 9. September 2010 Geschrieben 9. September 2010 Du speicherst in arr die Adresse des lokalen char-Arrays temp, das allerdings am Ende des if-Blocks aus dem Scope läuft, damit wird der Zeiger ungültig. Selbst wenn dir das nicht um die Ohren fliegt: Bei jedem Schleifendurchlauf liegt temp an derselben Stelle im Speicher, du speicherst also in jedem Element von arr dieselbe Adresse. Habe es auch schon mit malloc() versucht, jedoch ist dann irgendwann der Speicher voll und das Programm schmiert ab.Dann machst du da etwas falsch. Das wäre eigentlich der richtige Ansatz. Zeig doch mal den malloc-Versuch, nicht diesen Code, der gar nicht funktionieren kann Zitieren
SpecialAgentUwe Geschrieben 9. September 2010 Autor Geschrieben 9. September 2010 Erstmal danke für die schnelle Antwort. Hier der Versuch mit malloc(): char *arr[100]; int main(void) { char *name = "metadata-common.db3"; sqlite3 *db; char *stmtText = "SELECT name FROM stopwords WHERE art = 'prefix';"; sqlite3_open(name, &db); int listCount = 0; int retval; sqlite3_stmt *stmt; retval = sqlite3_prepare_v2(db, stmtText, -1, &stmt, 0); while(1) { retval = sqlite3_step(stmt); if(retval == SQLITE_ROW) { const char *result = (const char*)sqlite3_column_text(stmt,0); char *temp = malloc(sizeof(result)); strncpy(temp, result); arr[listCount++] = temp; } else if(retval == SQLITE_DONE) { break; } } sqlite3_finalize(stmt); sqlite3_close(db); return 0; } Das funktioniert leider nur bedingt. Bei der obigen Abfrage funktioniert's. Wenn die Ergebnismenge jedoch größer wird stürzt er ab. Zitieren
Klotzkopp Geschrieben 9. September 2010 Geschrieben 9. September 2010 Du hast eine falsche Vorstellung davon, was sizeof tut. Sizeof liefert dir die Größe eines Typs in Byte. sizeof(result) ist also sizeof(const char *), und das ist auf einer 32-Bit-Plattform üblicherweise 4. Für die Längenbestimmung musst du strlen benutzen. Und denke daran, ein zusätzliches Byte für die Nullterminierung zu reservieren. Zitieren
SpecialAgentUwe Geschrieben 9. September 2010 Autor Geschrieben 9. September 2010 Das ist natürlich mal eine wertvolle Information. Jetzt läft's. Vielen Dank für deine Hilfe. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.