C++ / Segmentation fault

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

C++ / Segmentation fault

Beitrag von oli_f » 21.04.2005 15:14:38

Hallo Forum

Ich habe hier etwas in C++ geschrieben, was immer einen Segfault ergibt, aber ich seh den Grund nicht ganz...

schematisch:

Code: Alles auswählen

void A()
{
   int * a;
   funktion B( a );
   cout << a[0];               <--- Hier wird abgebrochen
}

void B( int * a )
{
   a = new int[10]
   for ( int i = 0; i < 10; ++i )
      a = 0;
}
Komisch finde ich vorallem, dass es geht, wenn 'int * a' und 'void A' zu einer Klasse gehören, *a also nicht in der Funktion A erstellt wird.

Nun ja, hoffe auf Aufklärung :)
error - divided by 0

Benutzeravatar
HotblackDesiato
Beiträge: 203
Registriert: 12.08.2004 16:26:56

Beitrag von HotblackDesiato » 21.04.2005 16:05:20

Segmentation errors haben immer was mit fehlerhaften Speicherzugriffen zu tun, so wie hier auch. Du solltest das Array a[] besser in Funktion A allozieren und dann B mit a als Argument aufrufen. Außerdem musst du in Funktion B den Pointer a referenzieren, also a schreiben. Du setzt den Pointer in B mittels a=0 fälschlicherweise auf NULL und versuchst dann in A darauf zuzugreifen - daher der Fehler.

So müsste es gehen:

Code: Alles auswählen

void A() 
{ 
   int a[10];
   B( &a[0] ); 
   cout << a[0];
} 

void B( int * a ) 
{ 
   for (int i = 0; i < 10; ++i )  a[i] = 0;  // oder *a++ = 0;
} 
Warum machst du das denn überhaupt so kompliziert ?

Code: Alles auswählen

int a[10] = { 0 };   // erzeugt ein array und initialisiert es gleich mit Nullen
Stefan
Zuletzt geändert von HotblackDesiato am 21.04.2005 16:06:27, insgesamt 1-mal geändert.

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 21.04.2005 16:05:37

Code: Alles auswählen

void B( int * a ) 
{ 
   a = new int[10] 
   for ( int i = 0; i < 10; ++i ) 
      a = 0; 
}
wie wärs mit a=0 ?

oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

Beitrag von oli_f » 21.04.2005 16:42:45

ups ja natürlich, aber den tippfehler habe ich leider nur hier gemacht..

@ hotblackDesiato:
Ich weiss was ein Segfault ist, ich kann ihn nur nicht nachvollziehen. Das a = 0; ohne [] war ein Tippfehler, der im Originalen Programm nicht vorhanden ist...
Wieso ichs so kompliziert mache: weill ich im original nicht einfach alle 0 setzen wollte und ich's von da kopiert habe! Deine Lösung funktioniert nun, danke. trozdem verstehe ich nicht wieso es nach meiner Variante nicht geht, also so:

Code: Alles auswählen

void A()
{
   int * a;
   funktion B( a );
   cout << a[0];               <--- Hier wird abgebrochen
}

void B( int * a )
{
   a = new int[10];
   for ( int i = 0; i < 10; ++i )
      a[i] = 0;
} 
gruss oli
error - divided by 0

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 21.04.2005 16:47:23

oli_f hat geschrieben:trozdem verstehe ich nicht wieso es nach meiner Variante nicht geht
Du übergibst B einen int*, der als a ansprechbar ist. In der nächsten Zeile überschreibst du a mit einem neuen Wert, von dem bekommt die aufrufenden Funktion aber nichts mit.

Denn C++ macht call-by-value, nicht call-by-reference. Was du wolltest, wäre entweder (C++-Stil) mit referenzen gegangen:

Code: Alles auswählen

void B(int*& a)
oder (C-Style) mit doppelten Pointern:

Code: Alles auswählen

void B(int **a) {
  *a = new ...
  *a[0] ....
}
...  B(&a);
Referenzen sind (grob gesprochen) nur eine verkürzende Schreibweise für den C-Style.

HTH

oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

Beitrag von oli_f » 21.04.2005 17:04:21

ah ok, na dann danke

Es ist doch immer wieder tükisch.
error - divided by 0

Antworten