Bei char* immer "Segmentation fault"



  • Hallo Leute. Wenn ich mit char eine Variable festlegen will die mehrere Buchstaben enthalten soll mach ich das immer mit char* variable oder char *variable. Es lässt sich auch ohne Fehler kompileren aber wenn ich in dem Programm an die Stelle komme wo man die Variable braucht dann kommt immer Segmentation fault und das Programm beendet sich.



  • char* ist nur ein zeiger... wenn du auf den speicherbereich auf den der zeigt rumspielen willst musst du dir vorher erst mit new speicher allokieren damit du darin rummüllen darfst



  • Hallo,

    poste doch mal den code, dann kann dir bestimmt jemand nen Tip geben.



  • Hier ein Beispiel:

    #include <iostream>

    using namespace std;

    int main()
    {
    char* i;
    cout<<"Geben sie was ein: ";
    cin>>i;
    cout<<"Sie haben folgendes eingegeben: "<<i<<endl;
    };



  • probier mal so

    #include <iostream> 
    using namespace std; 
    
    int main(){ 
    char buffer[128]; 
    cout<<"Geben sie was ein: "; 
    cin>>buffer; 
    cout<<"Sie haben folgendes eingegeben: "<<buffer<<endl; 
    }
    

    am besten nimmst du aber gleich einen std::string wenn du c++ verwendest



  • char* ist ein Zeiger auf ein Zeichen im Speicher. Doch leider initialisierst du diesen Zeiger nicht, er zeigt also auf irgendeine Stelle im Speicher - und die gehört dir in den meisten Fällen nicht -> Segmentation fault.

    Es gibt zwei Möglichkeiten einen Native-String in C++ darzustellen, da wäre auf der einen Seite ein Array mit fixer Größe:

    char Name [30];
    cin.getline(Name,30);
    

    Hier werden automatisch 30 Zeichen Platz reserviert, allerdings ist dann natürlich das Problem, dass bereits zur Compiletime feststehen muss wie groß der Name ist.

    Möglichkeit 2 ist, dynamischen Speicher zu verwenden und diesen erst zur Runtime zu bestimmen:

    char* Name = 0; // Aha Pointer, mit 0 initialisieren ist immer gut, da man einen 0-Pointer immer freigeben kann ohne das etwas passiert
    
    Name = new char [x]; // Wir stellen x Zeichen Platz zur Verfügung - x kann kosntant sein oder aber vom User eingegeben werden, etc.
    
    cin.getline(Name,x); // Maximal x Zeichen einlesen
    
    // Hier kann Name verwendet werden
    
    delete [] Name; // Speicher freigeben (wenn hier Name != 0 ist und der Speicher nicht uns gehört (dies tut er bloß wenn wir ihn per new geholt haben oder Glück haben) dann kriegen wir auch hier wieder einen Segmentation fault.)
    //Wir haben den Speicher aber sicher per new geholt: Also ist sicherlich alles okay
    

    Möglichkeit 3 ist wohl das absolute Überding in C++, es wurde bereits standardmäßig eine Klasse erstellt die den Speicher für einen char* selbst verwaltet. Wir dürfen ganz normal mit = zuweisen und mit + Strings anhängen - über den Speicher musst du dir keine Gedanken machen:

    #include <string> // ohne .h!
    
    ...
    
    std::string Name;
    getline(cin,Name); // Neue Funktion die einen std::string einliest - dabei können auch mehrere Wörter eingegeben werden - Name enthält alles bis zum nächsten "Enter"
    

    MfG SideWInder



  • Gut das hilft mir weiter. Schönen Dank !


Anmelden zum Antworten