私が知っているように、c で時間をコンパイルする前に、配列には特定のサイズが必要です。
なぜこのコードがまだ機能するのだろうか?
int s;
printf("enter the array size: ");
scanf("%d",&s);
int a[s]; // Isn't s value determined at run time?
私が知っているように、c で時間をコンパイルする前に、配列には特定のサイズが必要です。
なぜこのコードがまだ機能するのだろうか?
int s;
printf("enter the array size: ");
scanf("%d",&s);
int a[s]; // Isn't s value determined at run time?
配列のサイズは、ANSI 89 C で知る必要があります。仕様の 99 バージョンでは、この制限が取り除かれ、可変サイズの配列が許可されました。
この機能の GNU バージョンのドキュメントは次のとおりです。
動的サイズの配列を割り当てる必要がある場合は、malloc() を使用してヒープから取得する必要があります。
int *a = malloc(sizeof(int) * s)
ここで2つのことを混同しています。
1)すでに割り当てられている配列のサイズを決定する(タイトルが意味する):sizeof()
合計を1つの(最初の)要素のサイズで割ります:
sizeof(a)/sizeof(a[0])
2) 質問に応じてメモリを動的に割り当てる:
int *a = (int*)malloc( s * sizeof(int) );
このコードは、C99 言語仕様でサポートされています。このコードは、拡張機能として C89/90 モードの GCC コンパイラでもサポートされています。
したがって、質問に対する答え (なぜ「機能する」のか) は、コンパイル方法によって異なります。通常、これは C89/90 コンパイラでコンパイルすることさえできません。
あなたの質問に適切な答えを与えるために、コンパイラによって変数にメモリがどのように割り当てられるかを理解することが重要です。メモリが変数に割り当てられるモードは 2 つあります。ヒープ上に配置するか、スタック上に配置することができます。ヒープ上のメモリは動的に割り当てられます。したがって、ヒープにメモリが割り当てられている変数には、実行時にそのサイズを指定できます。
C の場合の配列には、スタック上のメモリが与えられます。スタックにメモリを提供するには、メモリのサイズがコンパイル時にコンパイラに認識されている必要があります。そのため、実行時にスタック上の変数用に多くのメモリを確保できます。これが、C 言語に関する限り、実行時に配列のサイズを決定できない理由です。