2

我试图遍历每个数据库结果,并在最后一个字符串中用逗号分隔每行的单个字段。我知道这可以单独在 MySQL 中完成,但是我需要在每个结果上运行函数,这样使用 mysql only 方法是不可能的。

每隔几次运行,我就会得到一个段错误,不需要的字符被添加到输出中,例如 Linux 内部的“^H^G”或十六进制代码(08 和 07)。它编译正确,我只希望我能得到一致的结果。此代码在线程内,但所有变量都是当前线程的本地变量。

最终字符串应该是用户字符串字符。

这是我尝试使用的最新代码。

MYSQL dbh;
MYSQL *dbh_p;
MYSQL_RES *res;
MYSQL_ROW row;
char *userstring = NULL;
char *userstring_r;
size_t userstringsize = 0;
size_t rowsize = 0;

/* Database Connect Code Here [Connects Successfully] */

if(mysql_query(dbh_p,query) == 0) {
    res = mysql_store_result(dbh_p);
    if(mysql_num_rows(res) > 0) {
        while((row = mysql_fetch_row(res))) {
            rowsize = strlen(row[0]) * sizeof(char);
            userstringsize += rowsize + 1;
            userstring_r = (char *) realloc(userstring,userstringsize + 1);

            printf("%d %d %p\n", rowsize, userstringsize, userstring_r);
            if(userstring_r != NULL) {
                /* Where the Issue Is */
                userstring = userstring_r;
                strcat(userstring,row[0]);
                strcat(userstring,",");
            }else{
                free(userstring);
                printf("Error With Realloc\n");
                mysql_thread_end();
                pthread_exit(NULL);
            }
        }
    }
    mysql_free_result(res);
}else{
    printf("Query Error: %s\n",mysql_error(&dbh));
}

-- 编辑 -- 输出:

9 10 0x7fe5f4014d90
14 25 0x7fe5f4014d90
9 35 0x7fe5f4014d90
11 47 0x7fe5f4014d90
... (same format and pointer value);
*** glibc detected *** ./pthread: realloc(): invalid next size: 0x00007fe5f4014d90 ***

即使我将线程限制为 1,这也是结果。

感谢您的任何帮助或可能的问题。我不需要完整的代码,只需要提示/提示和可能的修复。我尝试过 strncat、memcpy 和更改各种大小,但没有任何运气。

4

1 回答 1

1

好的,我想我知道出了什么问题:

第一次userstring分配,它没有初始化为空字符串!基本上strcat一直将新数据放在它找到第一个\0字节的任何地方,这可能是任何地方。

您需要以某种方式检查它是否是第一次,并对其进行初始化。就像是:

if (userstringsize == 0)  // First time
{
    userstringsize += rowsize + 1;
    userstring_r = (char *) malloc(userstringsize + 1);
    strcpy(userstring_r, "");  // Initialise to empty string
}
else
{
    userstringsize += rowsize + 1;
    userstring_r = (char *) realloc(userstring,userstringsize + 1);
}
于 2012-11-27T21:23:21.523 回答