Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: harry_the_blogger en 19 Noviembre 2014, 16:11 pm



Título: Base de datos SQLite hace un Segmentation Fault al ejecutar sentencia SQL.
Publicado por: harry_the_blogger en 19 Noviembre 2014, 16:11 pm
Hola, estoy desarrollando una aplicacion sencilla que usa bases de datos SQLite en C/C++. Al hacer la consulta que crea una TABLA si no existe, la aplicacion hace una VIOLACION DE MEMORIA. He estado revisando con el depurador, pero no lo he podido conseguir.

No encontre un subforo adecuado para este tema, así que lo posteé aquí. Disculpen si aquí no iba. XD. El código es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. #include <sqlite3.h>
  5.  
  6. ///Global variables
  7. sqlite3 *db;
  8. char *zErrMsg = 0;
  9. int rc;
  10. char sql[128];
  11.  
  12.   ///Used to extract interesting data from callbacks.
  13. int number_of_rows_fetched;
  14. int money;
  15. int money2;
  16. const char *data = "Callback function called!!\n";
  17.  
  18. ///This function is called each time that a row if found.
  19. ///The only way to keep tracking how many rows has the table,
  20. ///it's increasing the counter.
  21. static int callback(void *data, int argc, char **argv, char **azColName){
  22.   printf("Callback is running!!\n");
  23.  
  24.   return 0;
  25. }
  26.  
  27.  
  28. int init(){
  29.  
  30.    ///Open database
  31.   rc = sqlite3_open("bank.db", &db);
  32.   if(rc != SQLITE_OK){
  33.      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  34.      exit(0);
  35.   }else{
  36.      fprintf(stderr, "Opened database successfully\n");
  37.   }
  38.  
  39.  
  40.  
  41.   ///Create Table if it doesn't exist
  42.   memset(sql, 0, sizeof(sql));
  43.   strcat(sql, "CREATE TABLE accounts("  \
  44.         "id INT            NOT NULL," \
  45.         "username           TEXT    NOT NULL," \
  46.         "password           TEXT    NOT NULL," \
  47.         "cash               INT);");
  48.  
  49.   ///Run query
  50.   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
  51.   printf("After the crash, i still alive\n");
  52.   if( rc != SQLITE_OK ){
  53.   fprintf(stderr, "SQL error: %s\n", zErrMsg);
  54.      sqlite3_free(zErrMsg);
  55.   }else{
  56.      fprintf(stdout, "Table created successfully\n");
  57.   }
  58.  
  59. }
  60.  
  61. int main(int argc, char* argv[])
  62. {
  63.  
  64.   init();
  65.  
  66.   return 0;
  67. }
  68.  
  69.  

Realmente he tenido dudas sobre si este tópico iría en este subforo, pero como no encuentro algo relacionado con Bases de Datos directamente, quise postearlo aqui.

Gracias de antemano.


Título: Re: Base de datos SQLite hace un Segmentation Fault al ejecutar sentencia SQL.
Publicado por: engel lex en 19 Noviembre 2014, 16:35 pm
en que linea exactamente y que dice el error?


Título: Re: Base de datos SQLite hace un Segmentation Fault al ejecutar sentencia SQL.
Publicado por: ivancea96 en 19 Noviembre 2014, 16:50 pm
¿Por qué declaras static la función callback?

He contado los caracteres, y tienes 145 caracteres en la variable 'sql' tras el strcat. No se si es cosa de tabulaciones, o es que en verdad es así. Cambia el tamaño de la variable (250 quizás) y revisa si sigue el problema.