Die Linie: Array von Zeigern
char* player_name[25];
ordnet ein Element 25 verkohlen. Ein Zeiger auf char wird im Allgemeinen als String betrachtet, daher könnte diese Deklaration als ein Array von Strings interpretiert werden, aber der Speicher zum Speichern dieser Strings existiert noch nicht. Sie müssten diese Zeichenfolge separat zuordnen.
Unter der Annahme, dass Zeiger 4 Bytes auf Ihrem Rechner sind, würde diese Zeile 25 × 4 = 100 Bytes zuweisen.
In C, wenn Sie einen Array-Namen ohne einen Index verwenden, "zerlegt" es in einen Zeiger auf das erste Element des Arrays.
So ... Wenn diese Zeile ausgeführt wird:
scanf("%s", player_name);
player_name Punkte auf 100 Byte Speicher, genug Platz genug 100 Zeichen zu halten, die in (gut 99 Zeichen plus ein Abschluss NUL Byte) gelesen werden, . Der Compiler schützt Sie nicht davor, diese Zeichen in dem Speicher zu speichern, der für 25 Zeiger zugewiesen wurde.
Schließlich:
foo = initFoo(player_name);
wird die Startadresse des Arrays an die Funktion übergeben initFoo(). Der Compiler weiß, dass dies wahrscheinlich falsch ist, da initFoo() einen Zeiger auf Zeichen und nicht auf einen Zeiger auf ein Array von Zeichenzeigern verwenden soll, aber Sie können es trotzdem tun, außer für die Warnung. Die Anweisung printf() in initFoo() interpretiert diesen Zeiger als Zeichenzeiger, und Sie erhalten die richtigen Ergebnisse!
Wie bereits gesagt wurde, wäre es richtig sein, die eine Zeile
char player_name[25];
zu ändern, die ein Array von 25 Zeichen erklärt.
Wenn Sie die Methode zu korrigieren, werde ich meine Antwort löschen. – ojblass