2011-12-29 13 views
2

私は、ウィキペディアのC99可変長配列のこの例に出くわした:C99可変長配列ウィキペディアの例

float read_and_process(int n) 
{ 
    float vals[n]; 

    for (int i = 0; i < n; i++) 
     vals[i] = read_val(); 
    return process(vals, n); 
} 

は、この間違ってますか?私は、可変長配列がまだポインタであるという印象を受けています。これは、上記のコードが期限切れのポインタvalをprocess(...)関数に渡していることを意味します。

+3

配列はポインタではありません。彼らはポインタに崩壊*するだけで簡単に迷惑をかけます。 – cHao

+0

+1 "配列はポインターではありません"。 [comp.lang.c FAQ](http://c-faq.com)のセクション6も参照してください。 –

答えて

6

ポインタの有効期限が切れていません。これは、関数read_and_processの終了まで有効なメモリへのポインタです。つまり、プロセスが呼び出されたときに定義されています。

これは、無効な使い方の例のようになります。

float read_and_process(int n) 
{ 
    float vals[n]; 

    for (int i = 0; i < n; i++) 
     vals[i] = read_val(); 
    return vals; 
} 
+0

ああ、それは理にかなっています。スタックを増やしている間は、メモリアドレスはまだ有効でなければなりません。 – Jeff

+1

@Jeff:それを見るための良い方法:配列(またはローカルではない 'static'オブジェクト)は、それを作成した関数が戻るまで存在し続けます。 (実際は、それは囲みブロック*に結びついていますが、この場合は同じです)。ローカルオブジェクトの存続期間は、プログラムテキストの領域ではなく、実行中の*時間*の範囲です。 'process'を呼び出すことは' read_and_process'の実行を終了させないので、配列はまだ存在します。 –

1

process()があるときfloat vals[n]含むread_and_process()の自動変数のすべてを、含まれているスタックフレームは、まだ有効で、メモリにすることを忘れないでください実行される。

関連する問題