【问题标题】:Strange issue with 2D arrays in cc中二维数组的奇怪问题
【发布时间】:2013-06-17 14:43:19
【问题描述】:

我目前正在处理一个 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 循环中。

感谢您提供的任何帮助。

【问题讨论】:

  • char* array[][2] = {0}; 不能用 gcc 为我编译,而是用 MSVC 生成一个 1x2 数组。你说数组有 50 行 - 你在哪里扩展 array 来为这些提供存储空间?

标签: mysql c multidimensional-array


【解决方案1】:

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

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

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

【讨论】:

  • 不错的答案。但我有一个小小的困惑。结果集在整个函数中是恒定的,mysql_fetch_row 将从结果集中检索行,那么如果mysql_fetch_row 仅从结果集中检索行,为什么行的位置会发生变化? (如果我错了,请纠正我)
  • MySQL 可能会在检索结果集后对其进行回收,因为一旦您调用mysql_fetch_row,我不相信还有另一种方法可以再次从 MySQL 获取该行。
  • 感谢您的帮助,修复了它,我忘记了 char* 的工作原理和指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2017-05-26
  • 2023-03-09
  • 2020-01-18
  • 2021-04-08
  • 2021-08-23
相关资源
最近更新 更多