2009-07-19 18 views
3

Wenn ich versuche, den folgenden Code zu kompilieren, erhalte ich einen Fehler: "Geben Sie Fehler in Argument 1 zu 'Allocate'; gefunden 'char * *' erwartete 'char *" an der angegebenen Zeile (< < < < <). Erklärungen würden geschätzt werden.Initialisierung von Array von Zeigern auf char

#include <stdio.h> 
#include <string.h> 

void allocate(char *dt); 

int main(void) 
{ 
    char *data[3]; 

    allocate(data); <<<<< 
    return 0; 
} 

void allocate(char *dt) 
{ 
    int i; 
    char buf[] = "A test string"; 

    for (i = 0; i < 3; i++){ 
    strcpy(&dt[i], buf); 
    printf("%s\n", dt[i]); 
    } 
} 

Mein Verständnis ist, dass ich so nennen zuweisen sollte: zuteilen (& Daten), aber mit diesem erhalte ich folgende Fehlermeldung: „Type Fehler in Argument 1‚zuteilen‘, gefunden‚char * (*) [ 3] ', erwartet' char * '".

Es sollte offensichtlich sein, dass ich versuche, den Inhalt von * data [] == buf zu machen.

Antwort

4

Es sieht aus wie Allocate versucht, drei Zeichenfolgen dynamisch zuzuordnen und sie jedem Mitglied eines Arrays von drei char* Zeigern zuzuweisen.

Arrays zerfallen zu Zeigern, wenn Sie sie als Funktionsargumente übergeben, was Sie wollen, also muss die Deklaration allocatevoid allocate(char**) sein. Passing in data übergeben Sie einen Zeiger auf das erste Element des Arrays, d. H. Einen Zeiger auf eine char*.

In allocate müssen Sie etwas Speicher für die neuen Zeichenfolgen reservieren. Ich nehme an, dass, weil dies ein Testbeispiel ist, Sie wirklich getrennte Kopien der Zeichenfolgen für jedes Mitglied des Arrays wollen.

Natürlich werden Sie an dieser Stelle wahrscheinlich eine deallocate Funktion wünschen und sicherstellen, dass diese immer aufgerufen wird, um die entsprechenden free für die neuen malloc s durchzuführen.

void allocate(char** dt) 
{ 
    int i; 
    size_t len; 

    char buf[] = "A test string"; 
    len = sizeof buf; 

    for (i = 0; i < 3; i++) 
    { 
     dt[i] = malloc(len); 
     if (dt[i] != NULL) 
     { 
      memcpy(dt[i], buf, len); 
      printf("%s\n", dt[i]); 
     } 
    } 
} 
+0

Charles: Danke - das bringt das gewünschte Ergebnis. –

0

Das Problem liegt in der Deklaration der variablen Daten. Sie haben sowohl einen Zeiger (*) als auch ein Array ([]) angegeben. Der tatsächliche Datentyp ist ein Array von Zeigerwerten.

Für diese spezielle Überladung fungiert das Array als ein weiterer Zeiger, so dass Sie einen char Zeiger in Daten (char**) haben. Die Funktion allocate erwartet einen einzelnen Zeigerwert.

Sie können dies beheben, indem Sie den Zeigerbereich der Datentypdeklaration entfernen.

char data[3]; 
+0

Aber dann machen die strcpy und die for-Schleife in allokieren keinen Sinn und sind gefährlich? –

+1

Jared: Ich versuche tatsächlich, ein Array von 3 Zeigern zu char zu füllen. Nicht Char Daten [3] bedeuten ein Array von 3 Zeichen? –

+0

@Charles, ja, das sind sie. Die unmittelbare Frage war, warum bekomme ich diese Nachricht, die ich versuchte zu decken. – JaredPar

0

Haupt ist richtig. Es ist allokiert, dass es falsch ist.

einfach zu ändern

void allocate(char *dt) 

zu

void allocate(char **dt) 

oder (äquivalent)

void allocate(char *dt[]) 

Das Argument wird zuzuteilen logisch "Ein String-Array", das ist die gleiche wie "Ein Array von Zeichenzeigern", das (soweit ein Argument betroffen ist) dasselbe ist wie "Ein Zeiger auf einen Zeichenzeiger".

+0

Tyler: Also wie würde ich das Argument zu verteilen() ausdrücken? –