Warum Segmentation Fault ?



  • Spiele mich gerade ein wenig mit Source Code ... warum dieser Code böse ist erschließt sich mir leider nicht ...

    #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;
    }
    

  • Mod

    Weil dein Zeiger auf nichts zeigt. Wenn du dann versuchst, auf das zuzugreifen, auf das der Zeiger zeigt, kracht es. ➡ Grundlagen von Zeigern angucken, das sollte so ziemlich als allererstes erklärt werden.

    Dein Code hat übrigens nicht viel mit C zu tun. Das ist so eine Art C++. Aber so programmiert, als wollte der Autor C programmieren. Wo hast du das her? Dringend den Lehrer/Lehrbuch wechseln!

    Konkret:
    -iostream ist C++.
    -string.h hat mit C++-Strings nichts zu tun.
    -string ist eine C++-Klasse.
    In C ginge das natürlich ganz anders, da Zeichenketten total anders sind als in C++. Hingegen würde man in C++ selbst als Anfänger nicht so mit rohen Pointern hantieren, wie es hier versucht wird. C und C++ sind zwei ganz verschiedene Sprachen. Mischung führt nicht dazu, dass man das Beste von Beidem bekommt, sondern im Gegenteil, kann man die Stärken von keinem der beiden nutzen und man bekommt noch zusätzlich jede Menge Probleme.



  • thx... das sind nur meine Selbstversuche 🙂 Will string + container mittesten in einem Project.

    p.s wenn ich einen Pointer definiere wird er doch mit einem zufälligen Wert initialisiert. Warum kann dieser nicht " garantiert " im Speichebereich des Programmes liegen ?

    int iZahl;
    int *pZahl;
    pZahl = &iZahl;
    

    So eine Code Konstruktion habe ich bisher noch nie gesehen. Geht das "schöner" ?



  • Bullz schrieb:

    Warum kann dieser nicht " garantiert " im Speichebereich des Programmes liegen ?

    Weil C eine Programmiersprache für Profis ist, die also wissen was sie tun, und keine für Anfänger, die nicht wissen, was sie tun.

    int iZahl, *pZahl = &iZahl;
    

    Einen Zwang, jeden Zeiger bei seiner Definition auf gültigen Speicher zu initialisieren, gibt es nicht, manche Compiler warnen manchmal bei der Dereferenzierung von uninitialisierten Zeigern.
    Globale und local-static Zeiger sind bei ihrer Definition " garantiert " auf NULL initialisiert.
    Den Versuch, "garantiert " auf etwas zeigen zu müssen, hat man in C++ mit Referenzen gemacht; die werden aber dort häufig nicht verwendet, aus Unwissenheit, Faulheit oder Überschätzung der eigenen Fähigkeiten zum Thema C-Zeiger.



  • Du kannst übrigens froh sein, von deiner Laufzeitumgebung diesen Fehler "Segmentation Fault" gemeldet zu bekommen, der C-Standard verpflichtet den Compilerbauer NICHT, Code für das hosted environment zu generieren, der zur Laufzeit bei undefiniertem Verhalten (nicht anderes ist der Zugriff auf undefinierten Speicher) einen Fehler zu melden.
    Dein Programm könnte auch einfach mit irgendwelchen Zufallswerten weitermachen, frei nach dem Motto vieler naiver Kundenvorstellungen wie "das Programm darf nicht abstürzen..." u.ä.



  • Wutz schrieb:

    Du kannst übrigens froh sein, von deiner Laufzeitumgebung diesen Fehler "Segmentation Fault" gemeldet zu bekommen, der C-Standard verpflichtet den Compilerbauer NICHT, Code für das hosted environment zu generieren, der zur Laufzeit bei undefiniertem Verhalten (nicht anderes ist der Zugriff auf undefinierten Speicher) einen Fehler zu melden.

    Die Meldung kommt vom Betriebssystem, nicht von der Laufzeitumgebung und nicht vom Compilerbauer. Sie kommt auch nicht wegen dem undefinierten Verhalten, sondern ist Teil des undefinierten Verhaltens.


Anmelden zum Antworten