2014-09-16 3 views
0

Ну, я уже неделю работаю над этим маленьким проектом как учебный опыт, когда я беру курсы C. Я до сих пор работал с ней почти безошибочно, мне было поручено сделать * con struct, потому что в конце я получал огромный стек (который был вызван проблемой указателя)SegFaults в C/MySQL через структурированный код

Моя программа отлично работает, все , Однако при закрытии соединения mysql я получаю segfault.

Код:

#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 дамп/Назад Трассировка

Программа получила сигнал SIGSEGV, неисправность Сегментация. 0xf7cca37e в mysql_close() из /usr/lib/i386-linux-gnu/libmysqlclient.so.18 (GDB) где

0 0xf7cca37e в mysql_close() из/USR/Lib/i386-Linux-гну/libmysqlclient.so.18

1 0x08048afa в попытке (getInput = 0xffffd37c "версия") в м-try.c: 61

2 0x0804894b в главной (ARGC = 1, ARGV = 0xffffd494) в main.c : 37 (GDB) BT

0 0xf7cca37e в mysql_close() из /usr/lib/i386-linux-gnu/libmysqlclient.so.18

1 0x08048afa в попытке (getInput = 0xffffd37c "версия") в м-try.c: 61

2 0x0804894b в главной (ARGC = 1, ARGV = 0xffffd494) в main.c: 37 (GDB) бросить

Я знаю, что есть 1000-х вопросов MySQL C, однако ни один из них не являются relavent к тому, что мне нужно в противном случае я, конечно, нашел бы его сейчас.

ответ

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);

You должен просто поместить этот вызов в ветвь «получить»;

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

большое спасибо. Извините, если я кажусь глупым, я просто изучаю C и как использовать GDB, и каждый ответ мешает мне задавать более глупые вопросы. Я бы троекратно поднял вас, если это возможно. – IndependentProgrammer

+0

Не волнуйся, я могу помочь. Но если вы хотите, вы можете принять ответ, чтобы понять, что проблема решена –

Смежные вопросы