2017-01-13 1 views
0

Ich bin ein wenig verwirrt über dieses kleine Programm:C-Programmierung: dynamisch zugewiesenen Speicher für Streich- und sqlite3_open funktioniert nicht zusammen

Wenn ich es laufen, Schleifen es bis i = 999 und dann „beschädigte doppelt verkettete gibt Liste". In func1 zeigt printf an, dass str wie str2 ist, aber in main str ist leer.

ich beobachtet, dass das Programm gut funktioniert, wenn ich eines von zwei Dingen tun:

  1. put in str2 eine kleine Zeichenfolge wie „Hallo“.
  2. kommentieren Sie den Code für die Datenbank (sqlite3_open und sqlite3_close);

Vielen Dank!

#include <stdio.h> 
#include <string.h> 
#include <sqlite3.h> 
#include <stdlib.h> 

sqlite3 *conn; 

void func1 (char* str) 
{ 
    char str2[3000]; 
    strcpy (str2, "dawNUkjhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwaauhfuiahfsuehusehfseihfseifjhselfjslkejfklsejfksejksejfeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeejjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUkjhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwaauhfuiahfsuehusehfseihfseifjhselfjslkejfklsejfksejksejfeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeejjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjUkjhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwaauhfuiahfsuehusehfseihfseifjhselfjslkejfklsejfksejksejfeeeeeeejjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjdawfa"); 

    // strcpy (str2, "Hello\n"); 

    str = (char*) realloc (str, sizeof (char) * (strlen (str2) * 2)); 
    strcat (str, str2); 

    printf ("func1: %s\n", str); 

} 

int main() 
{ 
    int dataBaseResult; 
    char* str = malloc (sizeof (char)); 

    /* open database */ 
    dataBaseResult = sqlite3_open ("magazin.db", &conn); 
    if (dataBaseResult != 0) 
    { 
     fprintf (stderr, "Problem %s\n", sqlite3_errmsg (conn)); 
    } 
    else 
    { 
     printf ("Opened succesfully!\n"); 
    } 


    for (int i = 0; i < 1000; i++) 
    { 
     printf ("main: %d\n", i);   

     strcpy (str, ""); 

     func1 (str); 

     printf ("main: %s\n", str); 
    } 


    /* close database */ 
    sqlite3_close (conn); 

    return 0; 
} 
+0

func1 wird nicht die str Zeiger zu aktualisieren. Sie müssen es wie 'void func1 (char ** str)' nennen. Außerdem rufen Sie realloc falsch an. Wenn es fehlschlägt und null zurückgibt, hast du verloren, was zuvor in str war. – bruceg

Antwort

1

Ändern Sie func1, um den übergebenen Zeiger korrekt zu aktualisieren. Etwas wie folgt aus:

void func1 (char **str) 
{ 
    char str2[3000]; 
    char *tmp = NULL; 
    strcpy (str2, "..."); 

    tmp = (char*) realloc (*str, sizeof (char) * (strlen (str2) * 2)); 
    if (!tmp) { 
     *str = tmp; 
    } 
    strcat (*str, str2); 

}

+1

Es hat funktioniert! Vielen Dank! – user3676857

0

Sie sind mallocing sizeof char, die 1 Byte ist. malloc sizeof char * 3001

+0

Ich habe es gerade versucht und funktioniert nicht. (gleiche Ausgabe) – user3676857

Verwandte Themen