- 论坛徽章:
- 0
|
这是我写的一个测试的程序,目的是想把从数据库查询得到的信息用GTK的图形显示出来:
- #include <stdio.h>;
- #include <gtk/gtk.h>;
- #include <mysql.h>;
- /* Define global variables */
- MYSQL *mysql;
- MYSQL_RES *query_result;
- MYSQL_ROW row;
- gchar *username = "root";
- gchar *password = "123456";
- gchar *database = "station_system";
- gchar *hostname = "localhost";
- /* End the global variables Define */
- gint
- query_mysql (gchar *query)
- {
- gint success = 0;
- if (mysql_query (mysql, query) == 0)
- {
- query_result = mysql_store_result (mysql);
- success = 1;
- }
- return success;
- }
-
- void
- window_quit()
- {
- printf ("Window quit!\n");
- gtk_main_quit();
- }
- gint
- main (gint argc, gchar *argv[])
- {
- gtk_set_locale ();
- gtk_init (&argc, &argv);
- GtkWidget *window;
- GtkWidget *button;
- GtkWidget *box;
- GtkWidget *label;
- gchar *query;
- if (mysql_init (mysql) == NULL) return 1;
- mysql = mysql_real_connect (mysql, hostname, username, password, database, 0, 0, 0);
- if (mysql == NULL) return 1;
- sprintf (query, "SELECT * FROM station WHERE province=\"广东省\"");
- if (query_mysql (query) == 0) return 1;
- row = mysql_fetch_row (query_result);
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- label = gtk_label_new (row[0]);
- button = gtk_button_new_with_label ("退出");
- box = gtk_vbox_new (TRUE, 5);
- gtk_window_set_title (GTK_WINDOW (window), "数据库窗口");
- gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
- //gtk_window_set_border_width (GTK_WINDOW (window), 10);
- gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (window_quit), NULL);
- gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
- gtk_container_add (GTK_CONTAINER (window), box);
- gtk_widget_show (label);
- gtk_widget_show (button);
- gtk_widget_show (box);
- gtk_widget_show (window);
- gtk_main ();
- mysql_free_result (query_result);
- mysql_close (mysql);
- return 0;
- }
复制代码
我用下面的参数编译成功:
gcc -o new new.c `gtk-config --cflags --libs` -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient -lz
但执行程序时出现“段错误”,然后程序退出
我使用GDB调试程序,在程序中的语句运行完查询语句,并用row数组取得一条记录后,我设置了一个断点,在这个断点后查询了row数组的值,里面的值已经是数据库里的内容了,即是说明数据库查询成功了。
之后我再一步步往下执行程序,当执行完显示主窗口的程序后,出现了预料中的窗口:我打算把数据库中查得的第一条记录的第一列字符串当作标签label = gtk_label_new (row[0]);的字符串显示出来。
此时程序运行在gtk_main ();按退出键之后,程序就收到了
Program received signal SIGSEGV, Segmentation fault.
0x4000c673 in _dl_fini () from /lib/ld-linux.so.2
的错误。
请大家帮忙看看,或者有什么建议如何寻找段错误一类程序错误的办法也说一下,在下是新手,不太懂。多谢!
程序中的图形如图 |
|