Zugriffsverletzung bei Charzuweisung



  • struct s_ingItem
    {
    	char				*ingName;
    	int					ingEffect[4];
    	struct s_ingItem	*p_next;
    	struct s_ingItem	*p_last;
    };
    
    [...]
    
    	p_ingListRoot			= new struct s_ingItem;
    	p_ingListRoot->ingName	= new char[256];
    
    [...]
    
    	p_ingListRoot->ingName		= "Not Defined"; // <- Geht ohne Probleme.
    
    [...]
    
    	p_ingListRoot->ingName[0] = 'C'; // <- Ergibt folgendes: 0xC0000005: Zugriffsverletzung beim Schreiben
    

    Ich kapier nur nicht ganz, weshalb. Sicher irgendein Anfängerfehler - hab lange nix mehr geschrieben.

    €dit: Oh, ich glaub ich habs falsche Unterforum erwischt ... 🙄


  • Mod

    Dein Zeiger zeigt auf ein Zeichenkettenliteral. Technisch gesehen müsste der Zeiger dafür eigentlich vom Typ const char* sein, da das Literal natürlich nicht veränderbar ist. Aus Kompatiblitätsgründen ist es in C aber trotzdem möglich, einem char* die Adresse eines Literals zuzuweisen (ein guter Compiler sollte dabei warnen, zumindest wenn du ein paar Warnoptionen aktivierst). Wenn du dann versuchst, über diesen Zeiger das Literal zu ändern, geht das schief.



  • Wenn du direkt das Stringliteral zuweist, ist das vorherige new char sinnfrei.
    Nehme stattdessen einfach

    strcpy(p_ingListRoot->ingName,"Not Defined");
    


  • Wie umgehe ich das Problem ?
    Ich benötige ein Chararray, das ich zur Laufzeit "befüllen" kann. (Zeichen aus einem Puffer übernehmen)

    Wenn ich statt

    struct s_ingItem
    {
        char                *ingName;
        int                    ingEffect[4];
        struct s_ingItem    *p_next;
        struct s_ingItem    *p_last;
    };
    
    struct s_ingItem
    {
        char                ingName[256];
        int                    ingEffect[4];
        struct s_ingItem    *p_next;
        struct s_ingItem    *p_last;
    };
    

    verwende, bekomme ich Probleme mit

    p_ingListRoot->ingName        = "Not Defined";
    

  • Mod

    Da ist Wutz mit seiner Antwort deiner Frage bereits zuvor gekommen.

    edit: Da ich es erst jetzt sehe: new? Das ist C++, kein C. Du meinst malloc.



  • Mh, stimmt - werd wohl um das strcpy() nich herumkommen, wenn ich nen kompletten String übernehmen will. Danke für die Aufklärung 👍

    @edit: Jopp, ich arbeite lieber mit new statt malloc - auch wenn der Rest eigentlich in C geschrieben is.


  • Mod

    😕 Aber bei C Sprachmitteln gibt es doch gar keinen Unterschied zwischen new und malloc. Außer, dass dein Programm nicht mehr mit einem C Compiler übersetzt werden kann.


Anmelden zum Antworten