2016-12-22 2 views
-1

so viel wie ich weiß, der nächste Code sollte nicht ausgeführt werden.deklarieren Größe Array in c

Das erste Problem ist die Deklaration von 'int i' innerhalb der Schleife und nicht am Startcode.

Das nächste Problem ist die Array-Größe ist in Laufzeit definiert und dafür müssen wir Dynamically Zuordnung verwenden.

Ich sollte "segment fualt" bekommen.

Ich betreibe es mit dem Befehl:

gcc -Wall commandLineArgument.c -o ex1

int main(void){ 
    int size=0; 
    printf("enter number:\n"); 
    scanf("%d",&size); 
    printf("The size is: %d\n",size); 
    int arr[size]; 
    for(int i= 0;i<size;i++) 
    { 
    arr[i] = 5; 
    } 

    for(int i= 0;i<size;i++) 
    { 
    printf("%d,",arr[i]); 
    } 
    printf("\n"); 
    return 0;} 

bearbeiten wenn variabler Länge Arrays haben in C, da C99 dann, wie der Update-Code ausgeführt wird gefördert?

gcc -Wall -std=c89 commandLineArgument.c -o ex1 

int main(void){ 
int i; 
int size=0; 
printf("enter number:\n"); 
scanf("%d",&size); 
printf("The size is: %d\n",size); 
int arr[size]; 
printf("The size of arr: %lu\n",sizeof(arr)); 
for(i= 0;i<size;i++) 
{ 
    arr[i] = 5; 
} 

for(i= 0;i<size;i++) 
{ 
    printf("%d,",arr[i]); 
}  
printf("\n"); 
return 0;} 
+2

Mögliche Duplikate von [Speichern Array-Werte aus benutzerdefinierten Array-Längen] (http://stackoverflow.com/questions/18951151/store-array-values-from-user-defined-array-lengths) –

+2

und so was ist Ihre Frage? – artm

+0

Für den ersten Teil ist es in C erlaubt, aber nicht in C++. Für den zweiten Teil hat jedes definierte "i" den Umfang der entsprechenden Schleife. –

Antwort

1

Dies ist anachronistisch: Ihr Code ist gültig seit C und C99.

Seit mindestens C99 können Sie i lokal in der for Schleife deklarieren.

Und Arrays mit variabler Länge werden in C seit C99 unterstützt. (Beachten Sie, dass dies auch in C++ 17 nicht unterstützt wird).

+0

Es hat * automatische Speicherdauer *; Das ist alles, was der Standard sagt. Ich nehme an, Sie können sich vorstellen, dass Sie auf dem Stapel sind. – Bathsheba

+0

ok, befindet sich das Array im Stack? – dids

+1

Der C-Standard hat keine Vorstellung von einem * Stack *. Deshalb bin ich vorsichtig, nicht wirklich darüber zu reden. Ich bin nicht überzeugt, dass es am selben Ort wie ein Array fester Größe von gleicher Länge wie "Größe" gespeichert werden muss.Vielleicht fragen Sie das als Frage, taggen Sie C und Sprachanwalt? – Bathsheba

1

Es scheint, als ob Sie eine alte Version von gcc verwenden.

Die beiden Funktionen, die Sie verwenden möchten, wurden in C99 hinzugefügt. Der Standard für gcc ältere Versionen als Version 5 ist die Kompilierung mit dem alten C89-Standard. Um Features zu verwenden, die in späteren Standards hinzugefügt wurden, müssen Sie älteren Versionen von gcc explizit mitteilen, einen neueren Standard zu verwenden. Die Compileroption -std=c11 weist gcc an, den aktuellen C11-Standard zu verwenden. Das Minimum, das Sie brauchen, ist -std=99.

Ich würde empfehlen, dass Sie gcc sagen, den aktuellen Standard zu verwenden:

gcc -Wall -std=c11 commandLineArgument.c -o ex1 

Eine andere Möglichkeit, das Problem zu lösen, ist zu gcc v5 oder höher zu aktualisieren.

Verwandte Themen