2013-05-05 81 views
0

我想在C中执行MySQL查询,但是在调用mysql_num_rows()时出现分段错误。C mysql_num_rows()分段错误

下面是我使用的代码:

char *username = "[email protected]"; 
char *password = "pass"; 

char query[1000]; 
int len; 
char *q = "SELECT * FROM Users WHERE `Email` = '%s' AND `Password` = '%s'"; 
len = snprintf(query, strlen(q) + strlen(username) + strlen(password), q, username, password); 
MYSQL_RES *result; 
if (db_query(query, result)) 
{ 
if (result != NULL) 
{ 
    int test_count = mysql_num_rows(result); 
    printf("%d\n", test_count); 
} 
} 
else 
{ 
printf("Query error\n"); 
} 

这里是db_query()函数:

bool db_query(const char *query, MYSQL_RES *result) 
{ 
    if (mysql_query(db_connection, query)) 
    { 
    printf("mysql_query(): Error %u: %s\n", mysql_errno(db_connection), mysql_error(db_connection)); 

    return false; 
    } 

    if (!(result = mysql_store_result(db_connection))) 
    { 
    printf("mysql_store_result(): Error %u: %s\n", mysql_errno(db_connection), mysql_error(db_connection)); 

    return false; 
    } 

    return true; 
} 

我测试过的查询和问题是不存在的连接也开始了。有任何想法吗?

谢谢!

回答

3

您的问题是在这里,在db_query功能:

if (!(result = mysql_store_result(db_connection))) 

分配给result在该函数的调用者没有明显的效果 - 你是按值传递一个指针,改变result的价值被叫方不会在调用方中对result做任何事情。

您需要更改函数以获取指针指针,并调整调用位置和函数。

bool db_query(const char *query, MYSQL_RES **result) 
{ 
    ... 
    if (!(*result = mysql_store_result(db_connection))) 
    ... 
} 
+0

这样做了,谢谢!看起来像我总是搞砸指针哈哈。干杯! – user1667175 2013-05-05 12:31:45

2

任何在你db_query功能result变化反射回给调用者,因此它仍包含在创建时(如没有初始化的自动变量它有任意值。

如果你想改变的价值有它反射回来,你应该双指针传递给它,然后取消引用双指针得到的实际值。

更妙将返回result值,并将其NULL /非NULL状态用于成功代码,而不是返回true/false

+0

是的,这是问题,谢谢! :) – user1667175 2013-05-05 12:39:21