MySQL与GTK2 GUI集成时mysql_num_fields触发段错误求助
问题分析与修复方案
你的段错误核心原因是**mysql_num_fields传入了NULL指针**,而导致res为NULL的根源是代码里的查询错误处理逻辑完全写反,还有fprintf的参数错误。下面是具体问题点和修复后的代码:
具体问题点
mysql_query判断逻辑颠倒:mysql_query返回0表示查询成功,非0表示失败。你的代码里写的是if (mysql_query(...))(即返回非0时)打印"Success!",这完全搞反了,查询失败时没有终止流程,继续执行后续代码导致res = mysql_store_result(con)得到NULL。fprintf参数错误:fprintf第一个参数必须是文件指针(比如stderr或stdout),你直接传字符串会导致未定义行为,可能破坏程序运行状态。- NULL指针未处理:当
res为NULL时,没有终止流程,直接调用mysql_num_fields(res),而该函数不接受NULL参数,触发段错误。
修复后的代码
void openDatabase(){ MYSQL *con; MYSQL_RES *res; MYSQL_ROW row; char *server = "localhost"; char *user = "root"; char *password = "Excalibur&1"; /* set me first */ char *database = "people"; con = mysql_init(NULL); /* Connect to database */ if (!mysql_real_connect(con, server, user, password, database, 0, NULL, 0)) { fprintf(stderr, "连接失败: %s\n", mysql_error(con)); exit(1); } // 修正mysql_query的判断逻辑:返回非0表示失败 if (mysql_query(con, "SELECT * FROM cars")) { fprintf(stderr, "查询失败: %s\n", mysql_error(con)); mysql_close(con); exit(1); } res = mysql_store_result(con); if (res == NULL) { fprintf(stderr, "获取结果集失败: %s\n", mysql_error(con)); mysql_close(con); exit(1); } int num_fields = mysql_num_fields(res); while ((row = mysql_fetch_row(res))) { for(int i = 0; i < num_fields; i++) { printf("%s ", row[i] ? row[i] : "NULL"); } printf("\n"); } mysql_free_result(res); mysql_close(con); }
额外注意事项
- 后续集成GTK2时,不要在GUI主线程中执行数据库操作(比如查询、连接),否则会导致界面卡顿,建议用线程单独处理数据库任务。
- 密码硬编码在代码里不安全,后续可以改成从配置文件或用户输入获取。
内容的提问来源于stack exchange,提问作者user3829969
相关产品推荐
相关产品推荐

