PDA

Visualizza la versione completa : [C] Segmentation fault nell'uso di puntatori


nomida
28-02-2007, 16:09
ciao!

non riesco a capire quando mi viene lanciato un segmentation fault
il codice del programma e' questo:



#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>



#define CTRLCODC "SELECT * FROM Corsi Where id_Corso = '%s';"

const char* host = "localhost"; // host di connessione
const char* database = "SIS"; // database di connessione
const char* db_user = "matteo"; // nome utente per la connessione
const char* db_pass = "Esedra#84"; // password non cifrata
#define INSSTU "INSERT INTO `Studenti` ( `Matricola` , `Nome_S` , `Cognome_S` , `email_s` , `Telefono_S` , `Pin Uni` , `Codice Sms` , `Indirizzo` , `Abbonato` )VALUES ('505013', 'Michele', 'Trevi', 'ssss@gmail.com', '3402313133', '234312', '324153', 'via pino', '0'); "
int collegmanetoDB(MYSQL * mysql ){

if (! mysql_init (mysql)) {
printf ("Errore nella allocazione di memoria.\n");

return -1;
}

if (! mysql_real_connect (mysql, host, db_user, db_pass, "",0, NULL, 0)) {
printf ("Errore nella connessione.\n");

return -2;
}

if (mysql_select_db (mysql, database)) {
printf ("Errore nella selezione del database.\n");
return -3;

}
return 0;

}





int main ()
{
MYSQL * mysql;

int i = 0, j = 0 ;
char c[10] ;
char * query;
char query1[100];
strcpy(c , "10001");


query = malloc ( 255 * strlen(INSSTU));
query = INSSTU;

printf("%s\n" , query );

if(collegmanetoDB( mysql ) != 0){
/* printf("Errore di qualcosa!!%d" , err);*/
return -1;
}


// esegue la query
if (mysql_query (mysql, query)) {
printf("Errore nella query.\n");
printf("%s" , mysql_error (mysql));
mysql_close (mysql);
return -1;
}






// chiude le risorse
mysql_close (mysql);

exit (EXIT_SUCCESS);
return 0;
}



e per adesso nessun problema!
ma se la funzione main la vado a chiamare "ehi" e la lancio da un main che si trova sempre nello stesso file
codice:


int main(){

int k;

k = ehi();
printf("%d" , k);
return 0;


e mi da' segmentation faulte! ma non capisco il perche'!!!

ciao grazie

oregon
28-02-2007, 16:25
Tanto per cominciare perche' fai la

exit (EXIT_SUCCESS);

se dopo esegui il return?

Io direi che la exit va eliminata ...

nomida
28-02-2007, 16:41
Ops!!!!!


pero' il problema rimane!!

potrebbe essere un problema del puntatore * mysql??pero non credo perche' altrimenti non andrebbe con la versione "1"!

nomida
28-02-2007, 16:46
se ti puo interessare questo e' quello che mi dice il debugger!

collegmanetoDB (mysql=0x8048515) at provaI.c:16
16 if (! mysql_init (mysql)) {
(gdb) step

Program received signal SIGSEGV, Segmentation fault.
0xb7d3e048 in memset () from /lib/tls/libc.so.6

oregon
28-02-2007, 17:44
A parte il fatto che il nome della funzione "collegmanetoDB" dovrebbe essere corretta in "collegamentoDB" (ovviamente questo e' un semplice dettaglio ...), il problema mi sembra che risieda nel puntatore

MYSQL * mysql;

che nel main passate alla funzione suddetta.

Ma quel puntatore non viene mai allocato nel main ...

nomida
01-03-2007, 12:52
forse mi ero spiegato male ti riscrivo il codice:




int prova (){


MYSQL * mysql;
int i = 0, j = 0 ;
char * query;
char query1[100];



query = malloc ( strlen(INSSTU));
query = INSSTU;

printf("%s\n" , query );

if(collegamentoDB( mysql ) != 0){
/* printf("Errore di qualcosa!!%d" , err);*/
return -1;
}


// esegue la query
if (mysql_query (mysql, query)) {
printf("Errore nella query.\n");
printf("%s" , mysql_error (mysql));
mysql_close (mysql);
return -1;
}






// chiude le risorse
mysql_close (mysql);
return 0;
}


int main(){

int k;

k = prova();
printf("%d" , k);
return 0;



chiamo la funzione prova e poi in prova creo il puntatore MYSQL * mysql che utilizzera' collegamentoDB
ho forse sbaglio ad utilizzare in quel modo il puntatore??

Loading