[C++] Problem "Segmentation Fault"

Simpson474 schrieb:
Um eins mal klarzustellen: Das von mir sind keine Referenzen, das sind Pointer.

Naja, aber wenn man in diesem Beispiel mit einem Pointer arbeitet kann man schon von "per Referenz" sprechen, hm? ;-) Eine Referenz in c++ ist ja nur eine sehr spezielle Art von Pointer. Ein Pointer der nur einmal zugewiesen werden kann und der wie eine "normale" Variable angesprochen werden kann... (korrigiert mich falls ich daneben liege...)

Das macht die Verwirrung jetzt wahrscheinlich komplett... lol :D:freak::freaky:
 
Eine Referenz ist ein Verweis auf etwas, d.h. sie hält die Adresse auf eine andere Variable.Also ist sie mehr oder weniger ein Zeiger.
 
Eine Referenz würde ich eine Art sicheren Pointer nennen. Eine Referenz zeigt genau wie ein Pointer auf einen Speicherbereich, nur dass der Speicherbereich garantiert gültig und ausreichend groß ist. Wenn möglich, dann sollte man unter C++ mit einer Referenz arbeiten.
 
Das mit den Referenzen habe ich kapiert, ist eine super Sache. :)
Nur bei den Pointern haperts, deshalb wollte ich es eben mit Pointern schreiben.

Das Bsp von Götterwind geht bei mir nicht, das wollte ich schon selber vorhin machen.

/.../calculator.cpp:52: error: cannot convert 'int**' to 'int*' for argument '3' to 'void addition(int, int, int*)'

Mit den Referenzen gehts natürlich 1a, aber wie gesagt, ich würde mich gerne etwas mit Pointern auseinandersetzen...
 
Das Beispiel von Götterwind aus Post 2 sollte funktionieren, aber deine Fehlermeldung klingt als hättest du die Übergabe wieder mit "&erg" statt nur "erg" gemacht. "erg" ist ja bereits ein Zeiger von daher würdest du mit "&erg" einen Zeiger auf einen Zeiger erstellen.
 
Jep, falschen Post abgetippt. :rolleyes:

Geht nun 1a. :)

Nur was:

erg = (int *)calloc(1,sizeof(int));

bedeutet, keine Ahnung. :D
Bin wohl noch nicht so weit...

Werde heute nacht wenn ich zurückbin mal noch bisschen try & error probieren...
Wäre es in diesem Bsp nicht sinnvoller, "a,b,*erg" global zu definieren?
 
Was das calloc(numer of elements, size of elemet) macht:

damit weist man per Hand Speicher für den Pointer zu (der muss ja auf irgendwas zeigen) und setzt den Inhalt (*pointer) auf 0. Es gibt noch die Funktion malloc(...), die lässt aber die Werte im Speicher auf ihrem ursprünglichen (willkürlichen) Wert. Machst du es nicht, dann zeigt der Pointer auf einen willkürlich Speicherbereich - der von anderen Prozessen benutzt werden darf ;)

Zum Schluß muss man wieder free(pointer) machen, ansonst gibt es ein memory-leak. Aber : es wird gefährlich, wenn man free(pointer) zweimal macht (schonmal freigegeben und dann nochmal freigeben ;) )...

Der Vorteil von selbst zugewiesenem Speicher ist die Möglichkeit, den Speicher dynamisch größer oder kleiner zu machen, wenn man z.b. aus einer Datei lesen will etc. ... Man muss also die größe des Arrays nicht wissen, sondern kann ihn anpassen, wenn nötig.

Das ist in anderen Sprachen nicht nötig, wie Java oder C#, da sollte es automatisch gehen.

Globale Definition von a,b,*erg:
a und b global (ich meinte was anderes - direkt bei Anfang nach main) zu definieren macht Sinn. Bei *erg sollte ja der Typ von der Operation abhängen. Eine Division ergibt keine ganze Zahl ;) Wäre dann also eine double.
 
Zuletzt bearbeitet: (global nicht gechecked)
Globale Variablen sollte man - wo möglich - vermeiden. Das einzige was ich machen würde, wäre die Definition von a und b außerhalb des if-blocks zu machen. Dies bietet zwar keinen Geschwindigkeitsvorteil, jedoch wird der Code besser lesbar. Und aus den if's würde ich - wie vorher schon jemand vorgeschlagen hat - ein switch - case machen.
 
TK-Shockwave schrieb:
new int wird aber nicht bei ANSI C++ benutzt...
Wie kommst du denn darauf...?

Btw, ein delete sollte man hier dann auch noch anbringen.

Simpson474 schrieb:
...nur dass der Speicherbereich garantiert gültig und ausreichend groß ist...
Die Aussage ist etwas gewagt :)
Code:
int* i = new int;
int& ri = *i;
delete i; // hoppla, ungültige Referenz
(natürlich macht man solche Schweinereien nicht absichtlich, aber sowas passiert einem schneller als man denkt - ein Schutz ist die Referenz nicht)

Hauptunterschied zwischen Referenzen und Pointern ist die Semantik, ob man nur gültige Objekte zulassen will oder auch Nullzeiger. Eine Pointerschnittstelle in C++ legt nahe, dass man auch Nullzeiger übergeben kann und darf. Nennt sich Design By Contract - man vereinbart in diesem Fall über die Schnittstelle, was man erwartet (eine Pointerschnittstelle könnte btw. auch eine Arrayschnittstelle suggerieren).

Aus dem Rest halte ich mich mal raus...
 
Zurück
Oben