繁体   English   中英

C编程:为字符串和sqlite3_open动态分配的内存无法一起使用

[英]C programming: dynamically allocated memory for string and sqlite3_open doesn't work together

我对这个小程序有些困惑:

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

我观察到如果执行以下两项操作之一,则该程序将运行良好:

  1. 在str2中放入一个小字符串,例如“ Hello”。
  2. 注释与数据库有关的代码(sqlite3_open和sqlite3_close);

谢谢!

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

更改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个字节的sizeof char。 malloc sizeof char * 3001

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM