Ansi C Programm
Chris
- sonstiges
0 Nachtrag
Chris0 Slyh
Hallo zusammen,
ich versuche eine kleines Ansi C Programm zu schreiben und hänge an einer blöden stelle fest ;-)
Durch den Compiler etc.. geht das Programm einwandfrei durch nur in dieser funktion bleibt er beim ausführen hängen mit der aussage "Segmentation fault" ...
hier die Funktion:
void change_db()
{
char *db;
printf("\n\nGeben Sie den Datenbanknamen ein: ");
scanf("%s",db);
getchar();
mysql_select_db(mysql,db);
printf("READY");
getchar();
}
Ich hoffe Ihr könnt helfen ;-)
Danke euch ...
Viele Grüße
Chris
kleiner Nachtrag:
Der Fehler kommt wenn ich die Eingabe bei scanf() gemacht habe und bestätige ...
Danke euch ...
Viele Grüße
Chris
hallo Chris,
Der Fehler kommt wenn ich die Eingabe bei scanf() gemacht habe und bestätige ...
Naja, die Frage ist, wie du diese Eingabe an dein Programm übermittelst. Der Codeschnipsel, den du gepostet hast, sieht zumindest auf den ersten Blick korrekt aus. So wie du im "Nachtrag" schreibst, hängt das Ganze, wenn du "%s" übermitteln möchtest. Aber wie du das im restlichen Programm anstellst, hast du nicht angegeben.
Und: ist dein Programm eine *.exe und läuft unter Windows, oder ist es eine ausführbare Datei auf LINUX/UNIX-Basis?
Es könnte unter Umständen auch noch irgendwelche logs geben (syslog)
Grüße aus Berlin
Christoph S.
Hallo Christoph S.,
... wie du das im restlichen Programm anstellst, hast du nicht >>angegeben.
Unten habe ich die Mainfunktion angehängt, ist eigentlich nur ein kleiner Switch von dem aus es dann zur Funktion change_db(); geht ...
Das Program ist ein Konsolen Programm und läuft momentan auf meinem Linux Server ...
Ich denke das das Problem beim einlesen liegt bei "%s", evtl. habe ich einfach den Wert der Variablen oder ähnliches falsch gesetzt ...
Fehler Mails bekomme ich keine und in den Logs ist auch nichts zu finden ...
Hier die Mainfunktion:
int main (int argc, char *argv[])
{
int auswahl;
printf("Baue verbindung zur Datenbank auf ...\n\n");
verbinden();
do{
printf("-1- Datenbank auswaehlen\n");
printf("-2- Programm beenden\n\n");
printf("Ihre Auswahl : ");
scanf("%d",&auswahl);
getchar();
switch(auswahl)
{
case 1: change_db();
break;
case 2: printf("...beende Verbindung zur Datenbank\n");
break;
default:printf("Falsche Eingabe\n\n");
}
}while(auswahl != 2);
verbindung_schliessen();
return 0;
}
Danke für die Mühen ...
hallo nochmals,
Das Program ist ein Konsolen Programm und läuft momentan auf meinem Linux Server ...
Ok. dann gibts ein paar andere Bedenken nicht.
Ich denke das das Problem beim einlesen liegt bei "%s", evtl. habe ich einfach den Wert der Variablen oder ähnliches falsch gesetzt ...
Jaein. Slyh hat dir oben ziemlich exakt beschrieben, wo es hängt. Es hätte allerdings sein können, daß du das an anderer Stelle im Gesamtprogramm abfängst, deshalb habe ich nachgefragt.
Fehler Mails bekomme ich keine und in den Logs ist auch nichts zu finden ...
Dann solltest du dir dein syslog mal anschauen und eventuell neu konfigurieren ;-)
Hier die Mainfunktion:
Ja, danke. Es hätte unter Umständen sein können, daß du im "main" oder an anderer Stelle den benötigten Speicher reservierst. Das ist aber nicht der Fall. Dann gilt das, was Slyh angemerkt hat.
Grüße aus Berlin
Christoph S.
hi!
Fehler Mails bekomme ich keine und in den Logs ist auch nichts
zu finden ...
Dann solltest du dir dein syslog mal anschauen und eventuell neu
konfigurieren ;-)
Programme, die mit einem Segfault abstürzen, kommen selten dazu, noch
irgend etwas anderes sinnvolles zu machen, geschweige denn in Logfiles
zu schreiben. Falls man darüber etwas genaueres herausfinden möchte,
kann man im core-File nachsehen, falls eines angelegt wurde. Das
Allerdings nur, wenn man Ahnung von Debuggern hat.
Hier die Mainfunktion:
Ja, danke. Es hätte unter Umständen sein können, daß du im "main"
oder an anderer Stelle den benötigten Speicher reservierst. Das ist
aber nicht der Fall. Dann gilt das, was Slyh angemerkt hat.
Das ist absoluter Unfug, wie man leicht an der ursprünglich geposteten
Funktion gesehen hätte, wenn man C könnte. Offensichtlich hast du
davon keine Ahnung. Wieso antwortest du dann überhaupt?
bye, Frank!
Servus Chris,
ich hab zwar schon ne ganze Weile nichts mehr mit C gemacht, aber probier diesen Code doch mal aus. Dem Chararray wird dabei Speicherplatz (hier 10 Byte) zugewiesen und dann müßte alles funktionieren. Ich habe zuerst gedacht es liegt daran, daß scanf() eine Adresse erwartet, aber db ist ja schließlich ein Pointer auf char und braucht keinen Adressoperator.
Ich hoffe ich konnte helfen.
Grüße Goofy
int main(void)
{
char *db = (char *) malloc(10*sizeof(char));
printf("\n\nGeben Sie den Datenbanknamen ein: ");
scanf("%s",db);
getchar();
printf("%s",db);
// mysql_select_db(mysql,db);
printf("READY");
}
Hallo,
Durch den Compiler etc.. geht das Programm einwandfrei durch nur in dieser funktion bleibt er beim ausführen hängen mit der aussage "Segmentation fault" ...
Und das heißt, daß du in Speicherbereiche schreiben (/lesen) möchtest,
die dir nicht gehören. Das tritt eigentlich nur dann auf, wenn ein
Pointer an eine falsche Stelle zeigt.
void change_db()
{
char *db;
Du erzeugst hier zwar einen Pointer (auf ein Char/Char-Array),
reservierst aber nirgends Speicher dafür. Auch initialisierst du den
Pointer nicht, so daß ein undefinierter Wert drin steht. Deshalb wohl
auch der Segmentation fault. Ich glaub "malloc" ist die Funktion, die
du suchst.
printf("\n\nGeben Sie den Datenbanknamen ein: ");
scanf("%s",db);
Hier erfolgt dann der Fehler, weil das Programm versucht die Eingabe
in einen ungültigen Speicherbeich zu schreiben (weil der Pointer
irgendwo hinzeigt).
Ich hoffe Ihr könnt helfen ;-)
Ich habe schon ewig nichts mehr mit C gemacht (und auch nie wirklich
professionell). Hoffe aber trotzdem, daß ich nicht allzu falsch
liege...
Gruß
Slyh