通过结构化Con的C / MySQL中的SegFaults

时间:2014-09-16 13:55:38

标签: mysql c linux

嗯,我已经在这个小项目上工作了一个星期左右,现在作为一个学习经历,因为我参加C课程。直到现在我几乎没有错误地工作了,我被指示制作* con一个结构,因为我最后得到了一个巨大的堆栈转储(这是由指针问题引起的)

我的程序运行正常,一切。但是在关闭mysql连接后,我得到了一个段错误。

代码:

#include <my_global.h>
#include <mysql.h>
#include <string.h>
#include <stdlib.h>
struct sql {

    MYSQL *con;

};

int try(char getInput[100]) {

   struct sql grab;
   MYSQL_RES *res;
   MYSQL_ROW row;
   char *server = "localhost";
   char *user = "root";
   char *password = "iluvgeordi"; 
   char *database = "test";

    if( strcmp( getInput, "version" ) == 0 )
        printf( "\n->Mysql Version: %s\n", mysql_get_client_info() );
    else if( strcmp( getInput, "get" ) == 0 ) {

        grab.con = mysql_init(NULL);

        if( !mysql_real_connect(grab.con, server, user, password, database, 0, NULL, 0) ) {

            fprintf(stderr, "%s\n", mysql_error(grab.con));
            exit(1);

        }

        if( mysql_query(grab.con, "show tables") ) {

            fprintf(stderr, "%s\n", mysql_error(grab.con));
            exit(1);

        }

        res = mysql_use_result(grab.con);
        if( res != NULL ) {

            while( ( row = mysql_fetch_row(res) ) != NULL )
                printf( "%s \n", row[0] );

        }
        mysql_free_result(res); 

    }

    mysql_close(grab.con);

}

即使我知道它的mysql_close,这里是GDB Stack Dump / Back Trace

  

编程接收信号SIGSEGV,分段故障。 0xf7cca37e in   来自/usr/lib/i386-linux-gnu/libmysqlclient.so.18(gdb)的mysql_close()   其中

     来自/usr/lib/i386-linux-gnu/libmysqlclient.so.18的mysql_close()中的

0 0xf7cca37e

     在m-try.c:61 中尝试

1 0x08048afa(getInput = 0xffffd37c&#34;版本&#34;)      main中的

2 0x0804894b(argc = 1,argv = 0xffffd494)在main.c:37(gdb)bt

     来自/usr/lib/i386-linux-gnu/libmysqlclient.so.18的mysql_close()中的

0 0xf7cca37e

     在m-try.c:61 中尝试

1 0x08048afa(getInput = 0xffffd37c&#34;版本&#34;)      main中的

2 0x0804894b(argc = 1,argv = 0xffffd494):37(gdb)退出

我知道有1000个mysql C问题,但是没有一个与我需要的相关,否则我现在肯定会找到它。

1 个答案:

答案 0 :(得分:1)

似乎错误是由try( "version" );

的调用引起的
1 0x08048afa in try (getInput=0xffffd37c "version") at m-try.c:61

事实上,如果您致电mysql_init()但是您总是致电grab.con

,那么您只需try( "get" )并为mysql_close( grab.con );分配一个值

你应该把这个电话放入&#34; get&#34;分支;

....
else if( strcmp( getInput, "get" ) == 0 ) {
    ...
    mysql_close( grab.con );
}