2017-01-24 6 views
0

code linkArray Initialisierung zur Laufzeit

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    int a = 2; 
    int b = 3; 
    int c; 
    c = a + b; 
    int arr[c]; 
    arr[5] = 0; 
    printf("%d",arr[5]); 
    return 0; 
} 

Ausgabe 0

Wie kommt es, dass es die Ordnungsnummer zur Laufzeit nimmt? Ist es ein neues Feature?

+2

Ist eine Funktion hinzugefügt letzten Jahrhundert "neu"? –

+0

Liegt es daran, dass Sie es bereits initialisiert haben? denn wenn du etwas wie printf machst ("% d", arr [4]); Sie erhalten einen Fehler –

Antwort

1

Diese Funktion (Array variabler Länge) wurde in C99 eingeführt. Aber das ist zur Zeit noch ein compilerabhängiges Verhalten. Einige Compiler (wie gcc) unterstützen dies. Einige (wie msvc) nicht.

BTW, arr[5] in Ihrem Code, ist außerhalb des Bereichs. Letztes Element sollte arr[4] sein.

+1

Dies ist Standard C. Nicht eine Erweiterung (obwohl es compilerabhängig ist, da Microsoft sehr langsam war, um C99 zu implementieren) – StoryTeller

+0

@StoryTeller Ich war mir dessen nicht bewusst. Ich habe etwas gegraben, nachdem ich deinen Kommentar gesehen habe und den Link in meiner Antwort aktualisiert habe. :-) –

3

Dies ist ein Array variabler Länge. Sie wurden in der Revision des C-Standards von 1999 eingeführt.

Leider kam die Unterstützung für sie langsam, so viel, dass die Revision 2011 sie zu einem optionalen Feature machte (aber sie sind noch standardisiert) .

Trotz cool aussehen, haben sie eine große Einschränkung. Sie können dazu führen, dass Sie den Aufruf-Stack überlaufen, wenn die Größe "zu groß" ist. Daher muss darauf geachtet werden, wenn sie verwendet werden.


Einige Compiler-Anbieter waren resistent, so dass es optional gemacht wurde, um sie zu beruhigen. Microsoft ist eine ganze Fallstudie dazu.

+0

Der Grund dafür, es optional zu machen, ist, weil die "Unterstützung für sie langsam kam"? Irgendeine Referenz? –

+0

@ P.P. - Das ist das Gefühl, das ich bekomme. Einige Compiler-Anbieter waren resistent, so dass es optional gemacht wurde, sie zu besänftigen. Microsoft ist eine ganze Fallstudie dazu. – StoryTeller

-1

nicht in (statisch/Festspeicherzuweisung) & (dynamische Speicherzuweisung) Konzepte :)

Lassen Sie mich Ihr Konzept bro klar verwechseln.

Relevant für folgende Frage,

      C supports two type of array. 

1. Static Array - werden auf Speicher in "Kompilierzeit" zugewiesen.

2. Dynamisches Array - Speicher bei "RUN TIME" zugewiesen.

Ques. Wie kann festgestellt werden, ob ein Array statisch oder dynamisch ist?

Ans. Array Deklaration Syntax: -

  int array_Name[size];  //size defines the size of block of memory for an array; 

Also, auf den Punkt kommen ->

Punkt 1. Wenn Größe zum Zeitpunkt der Kompilierung zu Array gegeben ist, es ist ein "Static Memory Allocation". Es wird auch "Speicherzuweisung mit fester Größe" genannt, da die Größe niemals geändert wird. Es ist die Grenze der ARRAY in C.

ex. int arr[10]; //10 is size of arr which is staticly defined int brr[] = {1000, 2, 37, 755, 3}; //size is equal to the no. of values initilizes with.

Punkt 2. Wenn die Größe zum Zeitpunkt der Kompilierung für Array angegeben wird, handelt es sich um eine dynamische Speicherzuweisung. Dies wird durch die in stdlib.h definierte Funktion malloc() erreicht.

Nun, seine ist die Klärung des Codes: -

#include <stdio.h> 

    int main(void) { 
     // your code goes here 
     int a = 2; 
     int b = 3; 
     int c; 
     c = a + b;    //c is calculated at run time 
     int arr[c];   //Compilor awaiting for the value of c which is given at run time but, 
     arr[5] = 0;   //here arr is allocated the size of 5 at static(compile) time which is never be change further whether it is compile time in next statements or run time. 
     printf("%d",arr[5]); 
     return 0; 
    } 

So, array (Größe 5) hält Wert 0 bei arr [5].
und andere Array-Indizes zeigen immer noch Müllwerte.

In der Hoffnung, Sie werden mit dieser Lösung für Ihr Problem zufrieden sein :)