2012-04-06 1 views
0
static char st[][8192]; 
void foo (int tab_size){ 
    st = (char**) malloc ((tab_size+1)*sizeof(char)*8192); 
} 

Ich erhalte den Kompilierungsfehler in "malloc" Zeile, die st hat unvollständigen Typ. Was ist falsch? Vielen Dank.Unvollständige Art Kompilierungsfehler mit malloc Speicherzuweisung

+1

Was versuchen Sie zu tun? – cnicutar

+0

Was ist falsch ist, dass 'st' ist kein' char ** '. Außerdem sollten Sie das Ergebnis von "malloc" nicht darstellen. –

+0

als eine Anmerkung gibt es keinen Grund, den Rückgabewert von 'malloc' in c zu werfen, und kann tatsächlich Probleme verursachen, da die' void * 'automatisch gefördert wird. – twain249

Antwort

1

Da Sie nicht die Größe der inneren Dimension für st angeben, wird der Compiler nicht weiß, wie groß es sein muss; daher ist der Typ unvollständig, und Sie es nie vor dem malloc Anruf abzuschließen.

Da es sieht aus wie Ihre Absicht st dynamisch zuzuweisen, mit Oli Rat gehen und erklären ihn als Zeiger auf ein 8192-Element-Array von char:

static char (*st)[8192]; 

und schreiben Sie Ihre malloc Aussage

st = malloc(sizeof *st * (tab_size+1)); 

sizeof *st == == sizeof (char [8192]) 8192. Diese Form ist etwas sauberer und leichter zu lesen. Beachten Sie auch, dass Sie in C das Ergebnis malloc nicht umwandeln müssen (es sei denn, Sie verwenden eine Implementierung vor C89, in diesem Fall tut es mir leid), und von dieser Vorgehensweise wird abgeraten. jeweils

Dadurch wird ausreichend Platz zuzuteilen tab_size + 1 Arrays von 8192 Zeichen zu halten.

Es ist nur im Rahmen einer Erklärung Funktionsparameter, dass T a[]a als Zeiger auf T erklärt.

1

Ihre Definition für st ist in der Tat nicht um einen vollständiger Typ.

Versuchen Sie stattdessen:

static char (*st)[8192]; 

void foo (int tab_size){ 
    st = malloc ((tab_size+1)*sizeof(*st)); 
} 
+0

Ein Zeiger auf ein Array? Wirklich gut :-) – cnicutar

+0

@OliCharlesworth es funktioniert gut, aber ich kann nicht bekommen, was jetzt ist st. Das ist eine Art Array? Und was bedeutet Größe von (* st)? – TatianaCooper

0

Sie sind verwirrend zwei völlig verschiedene Typen: ein Array vs Zeiger auf ein Array.

static char st[][8192]; 

deklariert st von Array zu sein. Es ist kein modifizierbarer L-Wert und kann nicht zugewiesen werden.

Wenn war Ihre Absicht, Raum für eine Reihe von ganzen Zahlen zuzuordnen und auf einen Zeiger auf die Zeigerdeklaration von Oli Charlesworth vorgeschlagen zuweisen.

Beachten Sie, dass Ihre Erklärung st nicht Platz obwohl zuordnen. wenn Sie so etwas wie dies versuchen, würden Sie eine Fehlermeldung erhalten ..

printf("0x%x\n", st); 

Compiler ist es wie eine Erklärung der Behandlung und erwartet, dass an anderer Stelle die tatsächliche Definition zu sehen. Es ist keine Definition, weil Sie den Wert für die erste Dimension des Arrays nicht angegeben haben.