Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
[x] Segmentation fault und Großes Fragezeichen in Bezug auf malloc

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 06. Okt 2004 11:32   Titel: [x] Segmentation fault und Großes Fragezeichen in Bezug auf malloc

Das folgende Programm löst in der mit "NOTE" markierten Zeile einen Speicherzugriffsfehler aus. Ich wüsste gerne, warum.

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int readwordlist(char **wordarray, char *listfilename);

/* start main */
int main(int argc, char **argv)
{
   /* char *prog=argv[0]; */
   char *wordlist=argv[1];

   int wordnumber;
   char **words;

   wordnumber=readwordlist(words, wordlist);
   fprintf(stdout, "Es wurden %d Woerter eingelesen.\n", wordnumber);

   return 0;
}
/* end main */

int readwordlist(char **wordarray, char *listfilename)
{
   FILE *fp;
   char c;
   char buf[100]; /* Maximale Wortlaenge */
   int index=0;
   int number=0; /* Die Anzahl der eingelesenen Woerter */

   if((fp=fopen(listfilename, "r")) == NULL)
   {
      fprintf(stderr, "Wortliste %s konnte nicht gelesen werden.\n", listfilename);
      exit(5);
   }
   
   /*TODO: Vielleicht mit Zeigern arbeiten */

   while((c=getc(fp)) != EOF)
   {
      if(index == 100)
      {
         fprintf(stderr, "Wortliste %s enthaellt zu langes Wort.\n", listfilename);
         exit(6);
      }

      if( (c == ' ' || c == '\t' || c == '\n') && index > 0)
      {
         buf[index]='\0';

         /* Speicher freigeben und puffer in *wordarray kopieren */
         if(( wordarray=malloc((index+1)*sizeof(char)) ) == NULL)
         {
            fprintf(stderr, "Speicher konnte nicht freigegeben werden.\n");
            exit(8);
         }
         
         /* FUNKTIONIERT: *wordarray="TEST"; */
         fprintf(stdout, "In buf liegt: \"%s\".\n", buf);
         fprintf(stdout, "Index=%d.\n", index);

         fprintf(stdout, "**wordarray hat die Groesse %d.\n", sizeof(**wordarray));
         fprintf(stdout, "*wordarray hat die Groesse %d.\n", sizeof(*wordarray));
         fprintf(stdout, "wordarray hat die Groesse %d.\n", sizeof(wordarray));

/* NOTE: LOEST SEGMENTATION FAULT AUS: */ strncpy(*wordarray, buf, index+1);

         wordarray++;
         number++;
         index=0;
      }
      else
      {
         buf[index]=c;
         index++;
      }

   }

   fclose(fp);

   if(number == 0)
   {
      fprintf(stderr, "Es konnte kein Wort aus %s eingelesen werden. Datei leer?\n", listfilename);
      exit(7);
   }

   return number;
}



Außerdem verstehe ich die Ausgabe dieser Zeilen nicht:
Code:

         fprintf(stdout, "**wordarray hat die Groesse %d.\n", sizeof(**wordarray));
         fprintf(stdout, "*wordarray hat die Groesse %d.\n", sizeof(*wordarray));
         fprintf(stdout, "wordarray hat die Groesse %d.\n", sizeof(wordarray));


Welche bei mir immer

**wordarray hat die Groesse 1.
*wordarray hat die Groesse 4.
wordarray hat die Groesse 4.

ist. (also **wordarray ist klar, weil's halt char ist.)

Befehle wie " **wordarray='t'; " brechen ebenfalls mit einem seg fault ab.


Zuletzt bearbeitet von Lateralus am 16. März 2005 13:25, insgesamt 1-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden

heinrich



Anmeldungsdatum: 22.09.1999
Beiträge: 219
Wohnort: N49.137 E8.544

BeitragVerfasst am: 14. Okt 2004 21:45   Titel: Re: Segmentation fault und Großes Fragezeichen in Bezug auf malloc

Ich drehe mal die Fragen rum, weil ich für deine erste Frage mehr Platz brauche...

Lateralus hat folgendes geschrieben::
Außerdem verstehe ich die Ausgabe dieser Zeilen nicht:
Code:

         fprintf(stdout, "**wordarray hat die Groesse %d.\n", sizeof(**wordarray));
         fprintf(stdout, "*wordarray hat die Groesse %d.\n", sizeof(*wordarray));
         fprintf(stdout, "wordarray hat die Groesse %d.\n", sizeof(wordarray));


Welche bei mir immer

**wordarray hat die Groesse 1.
*wordarray hat die Groesse 4.
wordarray hat die Groesse 4.

ist. (also **wordarray ist klar, weil's halt char ist.)


wordarray und *wordarray sind beides Zeiger (Datentyp: char* bzw. char**) wohingegen **wordarray lediglich vom Datentyp char ist.

Und jetzt zu deinem eigentlichen Problem...
Lateralus hat folgendes geschrieben::
Das folgende Programm löst in der mit "NOTE" markierten Zeile einen Speicherzugriffsfehler aus. Ich wüsste gerne, warum.

....Quellcode entfernt....


Kurze Erklärung:
Du versuchst einen Zeiger zu dereferenzieren der NULL ist. Beziehungsweise du möchtest einem NULL Zeiger etwas zuweisen.

Fehlerbehebung:
Code:

--- main.c.error   Thu Oct 14 22:05:00 2004
+++ main.c.fixed   Thu Oct 14 22:04:39 2004
@@ -51,7 +51,7 @@
          buf[index]='\0';
 
          /* Speicher freigeben und puffer in *wordarray kopieren */
-         if(NULL==( wordarray=malloc((index+1)*sizeof(char)) ))
+         if(NULL==( *wordarray=(char*)malloc((index+1)*sizeof(char)) ))
          {
             fprintf(stderr, "Speicher konnte nicht freigegeben werden.\n");
             exit(8);


Lange Erklärung:
ok, mal selbst das Programm ausführen...

Code:

./Lateralus Wortliste.txt
In buf liegt: "Wort1".
Index=5.
**wordarray hat die Groesse 1.
 *wordarray hat die Groesse 4.
  wordarray hat die Groesse 4.

Executable "Lateralus" has exited due to signal 10 (SIGBUS).


autsch... ein SIGBUS ... also gucken wir mal und bauen ein paar Debugging Ausgaben ein und probieren es nochmal:

Code:

./Lateralus Wortliste.txt
In buf liegt: "Wort1".
Index=5.
DEBUG:----------------------
  wordarray IS NOT NULL
 *wordarray IS     NULL
**wordarray

Executable "Lateralus" has exited due to signal 10 (SIGBUS).


ok, *wordarray ist NULL und du versuchst auf *wordarray zuzugreifen und den Pointer zu dereferenzieren um auf **wordarry zugreifen zu können. Das _muss_ ja fehl schlagen.

Aber schauen wir uns mal deinen Quellcode an und ändern mal die malloc() Zeile für wordarray. Hier der diff:

Code:

--- main.c.error   Thu Oct 14 22:05:00 2004
+++ main.c.fixed   Thu Oct 14 22:04:39 2004
@@ -51,7 +51,7 @@
          buf[index]='\0';
 
          /* Speicher freigeben und puffer in *wordarray kopieren */
-         if(NULL==( wordarray=malloc((index+1)*sizeof(char)) ))
+         if(NULL==( *wordarray=(char*)malloc((index+1)*sizeof(char)) ))
          {
             fprintf(stderr, "Speicher konnte nicht freigegeben werden.\n");
             exit(8);


und jetzt probieren wir es noch einmal:

Code:

./Lateralus Wortliste.txt
In buf liegt: "Wort1".
Index=5.
**wordarray hat die Groesse 1.
 *wordarray hat die Groesse 4.
  wordarray hat die Groesse 4.
In buf liegt: "Wort2".
Index=5.
**wordarray hat die Groesse 1.
 *wordarray hat die Groesse 4.
  wordarray hat die Groesse 4.
In buf liegt: "Wort3".
Index=5.
**wordarray hat die Groesse 1.
 *wordarray hat die Groesse 4.
  wordarray hat die Groesse 4.
Es wurden 3 Woerter eingelesen.

Executable "Lateralus" has exited with status 0.


Na also, geht doch.
_________________
It just works.
 
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 15. Okt 2004 8:17   Titel:

@heinrich
Danke! Wink
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy