http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: [EDIT] - Frage zu Segmentatin Fault

  • (nur registrierte Mitglieder)
Hi,

hab gerade ein problem bei dem ich bein besten willen nicht dahinter komme wo der unterschied liegt bzw.ob ich überhaupt richtig am weg bin. Bei meinem problem handelt es sich um ein mit malloc erzeugtes 2-dimensionales array in einem struct.

hier mal der wesendliche quellcode (printf hab ich nur mal zum testen)


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

struct game_field{
  unsigned int l;
  int **field;
};

static struct game_field *new_game_field(unsigned int l)
{	
  struct game_field *gfptr=NULL;
  struct game_field gf;
  
  gf.l=l;
  gf.field=malloc(l*sizeof(int *));
  if(gf.field==NULL) printf("Nicht genuegend RAM");
    for(int i=0; i<l; i++) {
      gf.field[i]=malloc(l*sizeof(int));  
      if(gf.field==NULL) printf("Nicht genuegend RAM");
    }
    
  //printf("Laenge: %d\n", gf.l);

  gfptr=&gf;  
  return gfptr;
}

int main(void) {
  unsigned int l=13;
  struct game_field *gf=new_game_field(l);  
  
  printf("%i\n", gf->field[5][5]);
  printf("%i\n", gf->field[4][5]);
  printf("Laenge: %i\n", gf->l);  
  return EXIT_SUCCESS;
}


so was ich nun überhaupt nicht verstehe ist, warum das programm funktioniert wenn ich das printf in der funktion new_game_field lasse und ich ein segmentation fault bekomme wenns ichs auskommentier?!

wär um jede hilfe dankbar mfg giggo

edit: ahja unter windows funktionierts einwandfrei
 
Immer wieder die Aussagen bei solchen Problemen: funktioniert einwandfrei. Es kann zwar sein das du das unter irgendeinem Compiler irgendwie zum Laufen bekommst, aber einwandfrei ist etwas anderes.

Der Quelltext deutet auf C als Programmiersprache hin. Also sollte,wenn das so ist, der Name der Quelltextdatei "meinedatei.c" lauten oder ähnlich. Ich hab keine Ahnung wie du deinen Compiler überzeugt haben willst aus dem Quelltext etwas Laufendes zu machen.

Ein normaler C-Compiler sollte dir hier den ersten Fehler anzeigen:
  gf.field=malloc(l*sizeof(int *)); 


Und deine Fehlermeldung deutet ja auch darauf hin das irgend etwas im Speicher falsch läuft.

MfG bcc-fan

--
C/C++
only just for fun

 

Re: Frage zu Segmentatin Fault

Patrick am 28.12.2011 um 08:53

Hallo,

sollte eine Speicheranforderung per malloc fehlschlagen, wird NULL zurückgegeben.
Hier sollte/muss der geplante Programmablauf unterbrochen werden.

In deiner Funktion gibt es die lokale Variable gf.
Am Ende dieser Funktion gibst du die Adresse eines Zeigers zurück, welcher auf diese lokale Variable zeigt.
Ausserhalb der Funktion kann man sich aber nicht auf den Inhalt dieser Adresse verlassen.

Anders sieht das aus, wenn du explizit Speicher anforderst.
In dem Fall musst du diesen aber auch selber wieder freigeben, oder aber das Programm beenden.

struct game_field{
  unsigned int l;
  int **field;
} typedef Gamefield;


static
Gamefield *
new_game_field2 ( unsigned length ) {
 Gamefield *gf = malloc(sizeof(Gamefield));

 if (NULL == gf) {
  puts("Speicheranforderung fuer Spielfeld-Zeiger fehlgeschlagen.");
  exit(EXIT_FAILURE);
 }

 if (NULL == (gf->field = malloc(sizeof(int) * length))) {
  puts("Speicheranforderung fuer Spielfeldmatrix fehlgeschlagen.");
  exit(EXIT_FAILURE);
 }

 int row=0, col=0;
 for (; row<length; row++) {
  if (NULL == (gf->field[row] = malloc(sizeof(int) * length))) {
   puts("Speicheranforderung innerhalb Spielfeldmatrix fehlgeschlagen.");
   exit(EXIT_FAILURE);
  }
  // Ggf. initialisieren
  for (col=0; col<length; col++)
   gf->field[row][col] = 1;
 }

 gf->l = length;
 return gf;
}

--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.

 
naja mein compiler war der ganz normale gcc und auch der hat mit -Wall -Werror keine fehlermeldung gebracht und ich versteh jetzt auch nicht was jetzt wirklich das problem mit der zeile ist.

aber wies im unteren post aussieht war mein fehler wohl einfach das der speicher den ich in der funktion zuweise nicht mehr im main() vorhanden ist. Dachte eigendlich das es dieses Problem bei malloc welches ja speicher vom heap nimmt nicht passiert!? naja aufjeden war gf.l nicht vom heap und das is glaub ich auch irgendwie das problem wies der Kollege unter dir beschrieben hat.

hab jetzt ja mal ne funktionierende lösung an der ich mich orientieren kann

danke auch beiden

mfg giggo
 

Re: Frage zu Segmentatin Fault

scusi71 am 29.12.2011 um 12:19

Hallo,
dein Problem besteht darin, dass die Funktion new_game_field einen Zeiger auf ein Stack Objekt - gf - zurück liefert. Diese Objekt existiert aber nach Ende der Funktion nicht mehr und somit kommt es bei Zugriff auf diese Objekt zu einem Speicherzugriffs Fehler.

Weitere Probleme bekommst Du wenn eine Speicheranforderung fehlschlägt, da Du dann, zwar nach einer entsprechenden Meldung, auf nicht allokierten Speicher zugreifst. Das malloc - ohne Cast - ist zumindest bis C99 korrekt.
 
  • (nur registrierte Mitglieder)