Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
oli_f
- Beiträge: 272
- Registriert: 24.10.2003 12:27:05
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
-
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.
-
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
-
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:
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