C编程:动态分配字符串的内存和sqlite3_open不能一起工作

时间:2017-01-13 18:30:16

标签: c sqlite realloc

我对这个小程序感到有点困惑:

当我运行它时,它循环直到i = 999然后给出"损坏的双链表"。在func1中,printf显示str与str2类似,但在main str中为空。

我发现,如果我做以下两件事之一,该程序运作良好:

  1. 把str2放在一个像#34; Hello"。
  2. 这样的小字符串中
  3. 注释与数据库相关的代码(sqlite3_open和sqlite3_close);
  4. 谢谢!

    #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;
    }
    

2 个答案:

答案 0 :(得分:1)

更改func1以正确更新传入的指针。像这样:

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 :(得分:0)

你是mallocing sizeof char,它是1个字节。 malloc sizeof char * 3001