2009-04-08 6 views
1

Ich hatte den Eindruck, dass sie das gleiche waren. Allerdings sieht es so aus, als würden sie hier anders behandelt. Der Teil, über den ich verwirrt bin, sieht so aus.Wie unterscheidet sich eine Zeichenfolge von einem Array von Zeichenzeiger in C?

Foo* initFoo(char* name); 

int main 
{ 
    Foo* foo; 
    char* player_name[25]; 
    scanf("%s", player_name); 
    foo = initFoo(player_name); 
} 

Foo* initFoo(char* name) 
{ 
    printf("\n%s", name); 
} 

Die Zeichenfolge wird ausgedruckt. Allerdings bekomme ich eine Compiler-Warnung, die besagt: Übergabe von Argument 1 von 'initFoo' von inkompatiblen Zeigertyp. Was fehlt mir an Zeigern?

Antwort

7

Ein String ist ein Array von Zeichen. Was Sie hier haben, ist ein Array von Zeigern auf Zeichen.

+0

Wenn Sie die Methode zu korrigieren, werde ich meine Antwort löschen. – ojblass

4
char* player_name[25]; /* means an array of character pointers. */ 
char player_name[25]; /* will get rid of the warning */ 
0

es zu beheben ändern:

char player_name[25]; 
6

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.

Verwandte Themen