You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:15:22