2

各データベースの結果をループしようとしていますが、各行のコンマから1つのフィールドを最後の文字列で区切ります。これはMySQLだけで実行できることは承知していますが、mysqlのみの方法では実行できないように、各結果に対して関数を実行する必要があります。

数回実行するたびに、セグメンテーション違反が発生します。Linux内の「^ H ^ G」や16進コード(08および07)などの不要な文字が出力に追加されます。正しくコンパイルされます。一貫した結果が得られればいいのですが。このコードはスレッド内にありますが、すべての変数は現在のスレッドに対してローカルです。

FinalStringはuserstringcharである必要があります。

これは私が使用しようとした最新のコードです。

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 に答える