speicherzugriffsfehler bei struktur (pointer)



  • hey, bin grad durcheinander.. wo genau is hier nochmal der fehler:

    struct player{
    
    int punkte;
    char name[10];
    
    } *p1;
    
    char string[10];
    
    void test(char *string){
    
    strcpy(p1->name,string);
    
    }
    

    das player1->name macht doch, dass er erst player1, was ja ein pointer ist, dereferenziert, und dann eben in "name" hineinschreibt..
    oder was hab ich da falsch verstanden?

    Danke :xmas1:



  • Worauf zeigt p1 denn?



  • auf eine instanz der struktur players.

    okay das geht vllt unter, kuck nochmal genau hin, beim deklarieren der struktur erstelle ich gleich eine instanz.



  • hdi-loggedout schrieb:

    okay das geht vllt unter, kuck nochmal genau hin, beim deklarieren der struktur erstelle ich gleich eine instanz.

    Das scheint wirklich unterzugehen. Ich sehe da nur die Deklaration eines Zeigers, nicht die einer Instanz.



  • hdi-loggedout schrieb:

    okay das geht vllt unter, kuck nochmal genau hin, beim deklarieren der struktur erstelle ich gleich eine instanz.

    du musst das sternchen weg machen, sonst ist es nur ein pointer.
    🙂



  • aber muss ich nicht einen pointer der struktur anlegen, wenn ich dann durch funktionen (mehrere) auf die attribute zugreif?

    weil ich will ja echt immer den wert dann einer struktur-instanz verändern, und nicht nur auf einer kopie arbeiten.

    d.h. der funktion "test" muss ich doch das ding als pointer übergeben, oder?
    wieso kann ich nicht gleich nen pointer anlegen?



  • Du kannst sicher gleich einen Pointer anlegen, aber du musst auch dafür sorgen, dass er auf eine gültige Struktur zeigt und nicht irgendwo ins Nirvana. Und so wie du es machst, zeigt p1 halt eben genau dahin.



  • und wie?

    ich wollte das jetzt anders machen, und zwar nicht gleich bei der struktur ne instanz anlegen sondern dann in der main-methode:

    struct player *p1;
    p1 = malloc(sizeof(struct player));
    

    aber das kann ich nicht compilen, weil über der main-methoden halt andere funktionen mit pl arbeiten, und dann sagt er mir, dass es das nicht gibt...

    also ich muss es wohl doch gleich machen. ich dachte er zeigt dann auf eine struktur wenn man es so macht..

    wie kann ich das denn ändern, sodass ich nich mehr ins nirvana zeig 😕



  • 1. Möglichkeit: Einfach keinen Zeiger verwenden. Der bisher verwendete Code legt nahe, dass hier ein Stack-Objekt vollkommen genügt.
    2. Du solltest das Objekt sowieso per Parameter an die Funktionen übergeben.
    Beispiel:

    struct tagPlayer
    {
        int punkte;
        char name[10];
    };
    typedef struct tagPlayer Player;
    
    void doSomething(Player* player);
    {
        player->punkte = 5;
        //...
    }
    
    int main()
    {
        Player* player1 = malloc(sizeof (Player));
        // oder besser:
        Player player2;
        // und dann:
        doSomething(player1);
        // oder:
        doSomething(&player2);
    
        // free() nicht vergessen!
        free(player1);
        // bei player2 nicht nötig.
        return 0;
    }
    

    Gruß
    Don06



  • ne das geht eben nicht 😞

    weil wenn ich nicht sofort mit der struktur eine instanz anlege, sondern erst in der main-methode, dann compiled das nicht!

    meine main-methode ist ganz unten im code, und darüber kommen zig funktionen, die mit player-instanzen rechnen.

    und dort greife ich z.B. auf "player1.name" zu usw, und er compiled halt nicht weil er in der zeile schon stecken bleibt mit dem fehler "player1 undeclared"..

    ps: wo liegt der sinn in diesem typedef? macht das etwas spezielles, ausser den namen zu ändern, den du dann benutzt wenn du die struktur benutzt?



  • ALLES KLAR !

    ich weiss echt nicht, was ich da gemacht hab..

    ich muss lediglich in der main-methode noch speicher alloziieren, wobei ich schwören könnte ich hab's gemacht, ich weiss ja dass man das tun muss!

    aber irgendwie hatte ich nen fehler bekommen...

    naja jetzt geht alles, ich erstelle gleich bei der struktur halt pointer-instanzen und malloc() dann in der main.

    danke für die hilfe 👍


Anmelden zum Antworten