Warum Segmentation Fault ?

Bullz

Commander
Registriert
Okt. 2008
Beiträge
2.108
Spiele mich gerade ein wenig mit Source Code ... warum dieser Code böse ist erschließt sich mir leider nicht ...

Code:
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;

string meineftk2(int *pInt)
{
	string a = "Text";
	return a;
}

int main() 
{

	int *pInt;
	*pInt = 10; // hier seg fault
	string ergString = meineftk2(pInt); // kommentiere ich diese Zeile aus gibt es keinen seg fault in der oberen Zeile 


	return 0;
}
 
Dein pInt Zeiger zeigt auf irgend eine zufällige Speichadresse. Du hast ihn ja nirgends mit einem definierten Initialwert belegt. Wenn du einen solchen Zeiger dereferenzierst, dann ist das Resultat eben undefiniertes Verhalten.

P.S. In C++ sind die korrekten #includes übrigens <cstdlib> und <cstring> (wenn du wirklichen den alten <string.h>-Header von C meinst) oder einfach nur <string> (wenn du std::string willst).
 
Zuletzt bearbeitet:
Hi,

Du musst den Speicher noch allokieren in den du die '10' hineinschreiben möchtest.
Am einfachsten ist das wenn du einfach ein int definierst (darauf kannst du dann ja auch zeigen), oder du arbeitest z.B. mit malloc(sizeof int).

Was du aktuell machst: Du biegst den Int Zeiger auf die Speicheradresse 10 um und willst diese dann in deiner Funktion verwenden. Da du auf Speicheradresse mit ziemlicher Sicherheit nichts zu suchen hast, funkt dir das BS dazwischen und löst einen SegFault aus.
 
M.E. schrieb:
Was du aktuell machst: Du biegst den Int Zeiger auf die Speicheradresse 10 um und willst diese dann in deiner Funktion verwenden. Da du auf Speicheradresse mit ziemlicher Sicherheit nichts zu suchen hast, funkt dir das BS dazwischen und löst einen SegFault aus.

Das stimmt nicht. Der Zeiger (der irgendwo in den Wald zeigt) wird dereferenziert und nicht woandershin zeigen gelassen. Dass kein Segfault kommt, wenn der Funktionsaufruf weggelassen wird, kommt höchstwahrscheinlich daher, dass der Bug wegoptimiert wird, denn die Variable wird nie benutzt. Sie kann also aus Sicht des Compilers keinen Einfluss auf den Ablauf des Programms haben und damit kann die Zuweisung beim Kompilieren ignoriert werden.

€: Und nein, das Betriebssystem funkt dir nicht wirklich dazwischen. Die Hardware löst den Segmentation Fault aus und der Exception Handler beendet den Prozess dann aus Notwehr. Niemand könnte ihm dabei einen Vorwurf machen!
 
Zuletzt bearbeitet:
Zurück
Oben