我在这个功能上遇到了段错误。
/**
* Excutes the passed query and returs the the first row as an array of
* strings. You must free this array by calling g_strfreev()
*/
static gchar** mysql_single_row(MYSQL *mysql_handle, char* query){
my_ulonglong num_rows=0;
MYSQL_RES *result = NULL;
gchar ** single_row = NULL;
GString *q = g_string_new(query);
MYSQL_ROW row={0};
int query_status = mysql_real_query(mysql_handle, q->str, q->len);
if(query_status!=0){
g_string_free(q, TRUE);
return NULL;
}
fprintf(stderr, "Storing mysql result!\n");
result = mysql_store_result(mysql_handle);
if(result==NULL){
/// it was not a query that returns statemnet (e.g. INSERT, DELETE)
g_string_free(q, TRUE);
return NULL;
}
num_rows = mysql_num_rows(result);
fprintf(stderr, "Total rows = %Ld\n", num_rows);
if(num_rows>0){
/// We only fetch the first row
row = mysql_fetch_row(result);
fprintf(stderr, "Copy single rows\n");
single_row = g_strdupv(row); // <------------- SIGSEGV happens here
fprintf(stderr, "Copy single rows done\n");
}else{
mysql_free_result(result);
g_string_free(q, TRUE);
return NULL;
}
/// clean up
g_string_free(q, TRUE);
mysql_free_result(result);
return single_row;
}
基本上我想要做的是执行一些'SELECT'查询并将第一行作为字符串数组返回。根据手册g_strdupv
应该复制返回的char **
并创建一个新的g_strfreev
。我回来了。稍后我使用{{1}}清理它,这是推荐的方法。
但为什么我在这里得到段错误。我用valgrind跑了。输出和相应的代码可以找到here
答案 0 :(得分:3)
g_strdupv()
复制NULL
- 终止的C字符串数组(每个字符串必须以NUL终止)。 C API Data Structures上的MySQL文档声明MYSQL_ROW
是一个字节字符串数组,不一定是NUL终止的&#34;如果字段值可能包含二进制数据&#34;。因此,MYSQL_ROW
既不保证是NULL
- 终止的数组,也不保证是C字符串数组。
可能发生了段错误,因为g_strdupv()
一直在寻找NULL
终止符,但在尝试读取非进程内存之前找不到段错误。