使用mysql_free_result“读取大小为1”

时间:2014-10-13 09:22:47

标签: c valgrind libmysql

我正在尝试从数据库中获取值并将其存储在全局变量中,如下所示:

mysql_query(con, query);
MYSQL_RES *result = mysql_store_result(con);
if ((row = mysql_fetch_row(result)))    
{
    global_variable = row[1];  
}  
mysql_free_result(result);

但是,每当我尝试访问我的global_variable时,我就会在Valgrind中收到“无效读取大小为1”。

==13345== Invalid read of size 1
...
==13345==  Address 0x60a3fea is 74 bytes inside a block of size 8,160 free'd
...
==13345==    by 0x4E67E9C: mysql_free_result (in /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0)
...

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您只是保存指针,而不是实际数据。通过调用free'd,数据为mysql_free_result,您的global_variable只是指向不安全内存的悬空指针。

您需要memcpystrncpy您自己缓冲区中row[1]的内容以便稍后使用,或者您可以在调用mysql_free_result之前使用它。

有关如何检索行长以复制它们的信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-lengths.html