Seite 1 von 1

tutorials.at: Tutorial-Beispiel stürzt ab

Verfasst: Di Jul 06, 2010 7:15 pm
von tauberheli
Hallo!

Ich habe das Beispiel aus dem C-Tutorial (Kap. 12.2, Dynamische Speicherzuweisung), mit dem man "theoretisch beliebig viel Text einlesen kann", kompiliert und dann laufen lassen.

Leider stürzt mir das Programm jedes Mal ab, wenn ich die Eingabe-Taste drücke.

Liegt es am Source-Code oder an meinem Compiler?

LG Heli

Edit by Xin: Betreff um 'tutorials.at:' erweitert

Re: tutorials.at: Tutorial-Beispiel stürzt ab

Verfasst: Di Jul 06, 2010 8:21 pm
von Xin
Wenn Du Dich auf ein Tutorial außerhalb von proggen.org beziehst, dann gib uns bitte wenigstens einen Hinweis darauf, auf welches Tutorial Du Dich beziehst. Die Inhalte von tutorials.at gehören nicht zu proggen.org!

Auf welches Beispiel beziehst Du Dich genau?


Edit: Ich habe jetzt mal alle drei Beispiele kompiliert und keines stürzte ab. Was genau machst Du?
Dennoch sind alle drei Beispiele falsch.
tutorials.at hat geschrieben:Nicht mehr benötigter Speicher kann mit free() wieder freigegeben werden. Z.B.:
Nicht kann - muss!

Re: tutorials.at: Tutorial-Beispiel stürzt ab

Verfasst: Di Jul 06, 2010 8:34 pm
von Kerli
Ich hab das Beispiel welches du vermutlich meinst auch ausprobiert und bekomme ebenfalls einen Fehler. Der Ursache dafür liegt in folgender Funktion:

Code: Alles auswählen

 
#define MAX 80
 
char *getLine()
{
   char buffer[MAX], *zeile = 0;
   int speicherbedarf = 0;
 
      /* eine Zeile einlesen, hoechstens MAX Zeichen */
   fgets(buffer, MAX, stdin);
 
      /* hier Ende, wenn die Zeile nur aus einem Punkt besteht */
   if ( (buffer[0]=='.') && ((buffer[1]=='\n') || (buffer[1]=='\r')) )
      return NULL;   // Ende signalisieren
 
   /* sonst ... (kein else-Block noetig!) */
 
      /* Speicherbedarf des Strings ermitteln */
   speicherbedarf = strlen(buffer) + 1;    /* Stringlaenge + 1 Zeichen fuer \0 am Ende */
 
      /* Speicher reservieren */
   zeile = (char *) malloc (speicherbedarf);    /* laenge entspricht dem Speicherbedarf in Bytes! */
 
      /* Buffer kopieren */
   strncpy (zeile, buffer, MAX);
 
      /* Zeiger zurueckliefern */
   return zeile;
}
Das Problem ist hier der Aufruf von 'strncpy (zeile, buffer, MAX);' da hierbei immer 'MAX' Zeichen in 'zeile' geschrieben werden, obwohl vorher sehr wahrscheinlich in der Zeile darüber weniger Speicher als 'MAX' dafür reserviert worden ist. Dadurch werden Speicherbereich mit Nullen überschrieben, in denen man eigentlich nichts zu suchen hat. In diesem Bereich liegen zufällig , zumindest bei mir Daten der Standardbibliothek zur Speicherverwaltung, die dadurch überschrieben werden und dadurch beim nächsten Aufruf von 'malloc' zu einem Fehler führen.