2016-04-14 14 views
0
hlist_t hlist[4]; 

int hlist_init (hlist_t **hlist) { 
    int i; 
    for (i = 0; i < 4 ; i++) { 
    INIT_HLIST_HEAD (hlist [i]); 
    } 

    return 1; 
} 



int main() { 
    hlist_init (&hlist); 

    return 0; 
} 

Ich habe Code wie folgt, aber es funktioniert nicht. Parameter als * hlist [] funktioniert auch nicht. Wie soll ich damit umgehen? und wie ** hlist und * hlist [] ist anders?Wie mehrere Listen (hlist) als Funktionsargumente übergeben werden C

unten ist die Fehlermeldung des Codes. /media/hdd1/tcn/lbtest/main.c:20:5: Warnung: Übergabe von Argument 1 von 'hlist_init' aus inkompatiblen Zeigertyp [standardmäßig aktiviert] /media/hdd1/tcn/lbtest/main.c: 6: 5: hinweis: erwartet 'struct hlist_t **', aber argument ist vom typ 'struct hlist_t (*) [4]'

+1

Wie funktioniert es "nicht", was ist der Fehler, Details? – fluter

+1

'hlist_t ** hlist' ist ein Zeiger auf den Zeiger auf' hlist_t' und 'hlist_t * hlist []' ist eine nicht identifizierte Länge des Arrays von Zeiger auf 'hlist_t'. Sie werden als Funktionsargument keinen Unterschied machen, da die Array-Deklaration im Funktionsparameter in Zeiger auf ihre Elemente konvertiert wird. – MikeCAT

+0

Bitte veröffentlichen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). – MikeCAT

Antwort

0

In einer Funktionsparameterliste sind **hlist und *hlist[] vollkommen identisch. Es wird also keinen Unterschied machen, ob man den anderen wechselt.

Dies ist, weil C "Array-Zerfall" hat, das heißt, in den meisten Fällen verfällt ein Array-Name zum Zeiger auf sein erstes Element. Unabhängig davon, ob Sie **hlist oder *hlist[] verwenden, wird das gesamte Array nicht kopiert. Sie können das Array also nicht übergeben, indem Sie in beiden Fällen foo(hlist); schreiben.

Scheint, dass Sie erwarten, dass hlist ein Array von Zeiger auf hlist_t sein wird. Wenn ja, tun Sie:

hlist_t *hlist[4];