2017-02-09 3 views
-2

ich diese Funktion aufrufen "funcName 4"Sehr seltsam Array-Deklaration Ausgabe - C

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[numPassedIn]; 

Die print-Anweisung druckt "4" verwendet. Macht Sinn.

Das Array KidPID ist jedoch nicht richtig initialisiert (deklariert?). Es gibt keinen Platz für pid_t's.

Wenn ich den Code ändern

int main(int argc, char** argv) { 
    int numPassedIn = atoi(argv[1]); 
    printf("%d", numPassedIn); 
    pid_t kidPID[4]; 

lesen es Platz bietet. Was ist denn hier los? Danke im Voraus!

+1

warum denken Sie, dass 'kidPID' nicht richtig zugeordnet? Mit statischer oder dynamischer Größe hat das Array die gleichen Eigenschaften. Was ist das Problem, das Sie mit der ersten Version haben, die Sie nicht mit der zweiten Version haben? (außer wenn Sie keine Argumente übergeben!) –

+0

Arrays mit variabler Länge sind eine optionale Implementierung und werden daher möglicherweise nicht von Ihrem Compiler unterstützt. –

+0

Woher wissen Sie, dass es nicht richtig zugeordnet ist? – immibis

Antwort

2

C ermöglicht die Deklaration von Variablenlängen-Arrays (VLAs), wenn die Anzahl der Elemente in einem Array zur Laufzeit festgelegt wird.

So ist in dieser Erklärung

pid_t kidPID[numPassedIn]; 

wird eine variable Länge-Array mit der Anzahl der Elemente gleich dem in der Variablen numPassedIn gespeicherten Wert erklärt. Wenn der Wert der Variablen numPassedIn gleich 4 ist dann in der Tat diese Erklärung (mit einigen Einschränkungen) entspricht der Erklärung

pid_t kidPID[4]; 
+0

Arrays mit variabler Länge werden jetzt nur aus Gründen der Abwärtskompatibilität unterstützt. –

+0

@WeatherVane Wurde ein neuer C-Standardentwurf veröffentlicht? –

+0

AFAIK das ist C11. Wahlweise. In C99 waren sie das Beste, was es je gab. Anscheinend nicht mehr. –