gpt4 book ai didi

C编程: dynamically allocated memory for string and sqlite3_open doesn't work together

转载 作者:行者123 更新时间:2023-11-30 15:01:09 25 4
gpt4 key购买 nike

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

当我运行它时,它会循环直到 i = 999,然后给出“损坏的双链表”。在 func1 中,printf 显示 str 与 str2 类似,但在 main 中 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);

}

关于C编程: dynamically allocated memory for string and sqlite3_open doesn't work together,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41641210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com