1

我目前正在做一个 C 项目,但在使用 2D 数组时遇到了问题。在我开始之前,我对 C 很陌生,所以如果这是一个直截了当的问题,请原谅我。

我想要做的是初始化一个数组,并将它传递给一个函数来检索结果。完成后,原始函数可以循环遍历数组。

该数组包含 50 行,每行 2 个元素。

下面是我如何初始化数组和调用函数。

char* array[][2] = {0};
    int result = loadArray(&HandleDB, &array);

下面是 loadArray 的函数

int loadArray(MYSQL *HandleDB, char *array[][2])
{
    int sqlLen = 0;
    char *sql;
    MYSQL_RES *resultReport;
    MYSQL_ROW rowReport;

    sqlLen = asprintf(&sql, "SELECT * FROM TblLookups");

    SL_DebugAll(DBG_ALWAYS, sql);
    if ((mysql_real_query(HandleDB, sql, sqlLen)))
    {
        printf("MySQL Error: %s\n", mysql_error(HandleDB));
        return 1;
    }

    resultReport = mysql_use_result(HandleDB);

    int i = 0;
    while ((rowReport = mysql_fetch_row(resultReport)))
    {

        array[i][0] = rowReport[0];
        array[i][1] = rowReport[1];
        printf("%s:%s\n", array[i][0], array[i][1]);
        i++;
    }
    printf("***\n\n");

    for (i = 0; i < 50; i++)
    {
        printf("%s:%s\n", array[i][0], array[i][1]);
    }
    return 0;
}

现在我遇到的问题是在 while 循环错误后打印出数组的内容,但在 while 循环内是正确的。

例如,在 while 循环中,它从 MySQL 结果中获取值,然后打印它存储在数组中的内容,我得到以下输出:

colA1:colB1
colA2:colB2
colA3:colB3

然后当我在 for 循环中循环相同的数组时,我得到以下

:colB1
:colA1
:colB2
:colA3
:colB3
:colA2

我不明白为什么这在 for 循环中不起作用,但在 printf 语句是访问同一数组的相同代码时却在 while 循环中。

感谢您的任何帮助,您可以提供。

4

1 回答 1

2

您用于迭代多维数组的代码很好。但是,您将字符指针存储(char *)在数组中。这意味着您实际上并没有存储结果字符串本身,而是存储它们时它们在内存中的位置。但是,每次调用时,MySQL 都会在内部更改该位置mysql_fetch_row(resultReport),因此您的字符指针最终会指向不同或无效的数据。

存储结果的正确方法是创建字符串的副本并使您的数组元素指向该副本。一种方法是

while ((rowReport = mysql_fetch_row(resultReport)))
{

    array[i][0] = strdup(rowReport[0]);
    array[i][1] = strdup(rowReport[1]);
    printf("%s:%s\n", array[i][0], array[i][1]);
    i++;
}
于 2013-06-17T14:51:37.880 回答