[MySQL-C-API] "Segmentation fault"

moses_78

Aktives Mitglied
Thread Starter
Dabei seit
08.04.2005
Beiträge
1.288
Reaktionspunkte
22
Tach zusammen :),

ich beschäftige mich zur Zeit mit dem MySQL-C-API (leider erfolglos). Immer,
wenn ich mein kompiliertes Programm starte, bekomme ich den Fehler "Seg-
mentation fault".

Hier der Code:
Code:
#include <stdio.h>
#include "/usr/local/mysql/include/mysql/mysql.h"


#define def_host_name NULL
#define def_user_name 'root'
#define def_password  '<passwort>'
#define def_db_name   NULL 


MYSQL	*conn;

int main(int argc, char *argv[])
 {	
 	conn = mysql_init(NULL);
 	
 	if(conn == NULL)
 	 {
 	 	fprintf(stderr, "mysql_init() fehlgeschlagen\n");
 	 	exit(0);
 	 }
 	 
 	if(mysql_real_connect(
 		conn,
 		def_host_name,
 		def_user_name,
 		def_password,
 		def_db_name,
 		0,
 		NULL,
 		0) == NULL)
 	 {
 	 	fprintf(stderr, "mysql_real_connect() fehlgeschlagen\n");
 	 	exit(0);
 	 }
 	 
 	mysql_close(conn); 
 
	return 1;
 }
Ich habe die ganze Geschichte mit gcc 4.0.0 kompiliert, mit folgenden Flags:
gcc client1.c -L/usr/local/mysql/lib/mysql -lmysqlclient -o client1

Dabei kommen folgende Warnings heraus:
Code:
client1.c: In function 'main':
client1.c:20: warning: incompatible implicit declaration of built-in function 'exit'
client1.c:25:4: warning: character constant too long for its type
client1.c:27:4: warning: character constant too long for its type
client1.c:31: warning: passing argument 2 of 'mysql_real_connect' makes pointer from integer without a cast
client1.c:31: warning: passing argument 3 of 'mysql_real_connect' makes pointer from integer without a cast
client1.c:31: warning: passing argument 4 of 'mysql_real_connect' makes pointer from integer without a cast
client1.c:34: warning: incompatible implicit declaration of built-in function 'exit'

Wie schon erwähnt, ich kann damit wenig anfangen. Ich wäre dankbar für Vor-
schläge aller Art :)

Gruß Mathias
 
*push*

Och kommt, keiner 'ne Idee :(

Was heist denn eigentlich "segmentation fault"?
 
segmentation fault heisst, dass das programm auf einen speicher begreif zugreifen will, auf die es nicht zugreifen darf...

warum liest du nicht die docu vernünftig?
http://dev.mysql.com/doc/refman/4.1/en/c-api-function-overview.html

da steht
Application programs should use this general outline for interacting with MySQL:

Initialize the MySQL library by calling mysql_library_init(). The library can be either the mysqlclient C client library or the mysqld embedded server library, depending on whether the application was linked with the -libmysqlclient or -libmysqld flag.

Initialize a connection handler by calling mysql_init() and connect to the server by calling mysql_real_connect().

Issue SQL statements and process their results. (The following discussion provides more information about how to do this.)

Close the connection to the MySQL server by calling mysql_close().

End use of the MySQL library by calling mysql_library_end().
 
Detailiertere Informationen kannst Du doch schon gar nicht mehr bekommen…

Dein Programm versucht auf einen Speicherbereich zuzugreifen, der vorher nicht dafür alloziert wurde. Genau das ruft einen „Segmentation Fault“ hervor.
Du solltest Dich mal ganz genau mit Datentypen und „Type Casting“ in C befassen…
 
oneOeight schrieb:
segmentation fault heisst, dass das programm auf einen speicher begreif zugreifen will, auf die es nicht zugreifen darf...
Danke, dass ist doch schon was :)

oneOeight schrieb:
....warum liest du nicht die docu vernünftig?....
Erstens basiert mein Codeschnipsel oben nicht auf der offiziellen MySQL-Doku
(ich wusste nichtmal, dass es zu dem MySQL-C-API ein Kapitel auf dev.mysql.
com gibt) und zweitens kannst du mir glauben, dass ich zu den Leuten gehöre,
die wirklich lieber nochmal die Dokus wälzen, anstatt die Frage in einem Fo-
rum zu posten (nur in diesem Fall hab ichs versäumt....) ;)

Yves schrieb:
Du solltest Dich mal ganz genau mit Datentypen und „Type Casting“ in C befassen…
Mache ich...

Einen schönen Abend euch noch... :)

Edit: Noch eine generelle Frage: Werden die Bibliotheken, die ich mit dem
Flag "-lmsqlclient" einbinde, fest einkopiert, d.h. ich könnte sie theoretisch
löschen, oder werden sie bei jeder Ausführung des Programmes geladen, wie
eine DLL unter Windows?
 
Zuletzt bearbeitet:
Erstmal ein kleiner Hinweis auf Deine Ursprungsfrage: Leider werden warnings oftmals ignoriert, da es ja nur Warnings sind. Aber wie man in Deinem Fall sehen kann, hängen Segmentation faults und warnings über Typen meist zusammen.

Zu deiner zweiten Frage: Ich weiß jetzt die Befehle nicht aus dem Kopf, aber Du hast eigentlich immer die Möglichkeit, die Bibliotheken dynamisch oder statisch zu linken. Es gibt sogar Anwendungsbereiche, z.B. bei medizinischen Anwendungen, da muss man statisch Linken, da man ansonsten keien Zulassung der Software bekommt.
 
Zurück
Oben Unten