Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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ß

Geschrieben

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 ;)
Geschrieben

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.

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...