c++ - libmysql:警告:返回局部变量 ‘rows’ 的地址 (C++/C)

标签 c++ c libmysql

我正在使用 g++。

为方便我使用 libmysql 实现了一些包装器。还制作 C/C++ 兼容代码。

static MYSQL_RES *db_query(MYSQL *db, const char *query, va_list params) {
    char q[500];
    vsprintf(q, query, params);
    va_end(params);
    if (mysql_query(db, q)) {
        fprintf(stderr, "%s\n", mysql_error(db));
        return NULL;
    }

    MYSQL_RES *res = mysql_use_result(db);
    return res;
}

MYSQL_ROW* db_query_all(MYSQL *db, const char* query, ...) {
        va_list params;
    MYSQL_RES *res = db_query(db, query, params);

    int count = mysql_num_rows(res);

    MYSQL_ROW rows[count];
    for (int i = 0; i<count; i++) 
    {
        rows[i] = mysql_fetch_row(res);
    }

    mysql_free_result(res);
    return rows;
}

并在编译期间收到警告:

warning: address of local variable ‘rows’ returned [-Wreturn-local-addr]
     MYSQL_ROW rows[count];

请帮我找出问题所在。我无法用谷歌搜索与我的特定案例相关的内容。

最佳答案

更多的 C++ 方法是定义一个 movable缓冲区类型:

struct Buf {
  Buf(size_t size) : mPtr(std::make_unique<MYSQL_ROW[]>(size)), mSize(size) {}

  std::unique_ptr<MYSQL_ROW[]> mPtr;
  size_t mSize;
};

然后你可以这样实现这个功能:

Buf db_query_all(MYSQL *db, const char* query, ...) {
        va_list params;
    MYSQL_RES *res = db_query(db, query, params);

    int count = mysql_num_rows(res);

    Buf rows(count);
    for (int i = 0; i<count; i++) 
    {
        rows.mPtr[i] = mysql_fetch_row(res);
    }

    mysql_free_result(res);
    return std::move(rows);
}

这种方法的一大优点是您不必进行手动内存处理。

关于c++ - libmysql:警告:返回局部变量 ‘rows’ 的地址 (C++/C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58335356/

相关文章:

c++ - if else分支,return语句的位置?

mysql - 使用 MySQL C API 直接获取数字

mysql - 编译MySQL C API客户端未链接libmysqlclient.so.20

c++ - 原生 CheckedListBox?

c++ - 在负载测试中对 __pthread_mutex_cond_lock_full 断言失败

将字符数组转换为具有 2 个小数位的 float

c - c 套接字编程错误 : after accept(), 程序将关闭。

c - 我应该按值还是按指针返回结构?

c++ - 使用嵌入式 mysql C++ 创建触发器

c++ - 如何在 C++ 中使用 Unicode (UTF-8)