3

重複の可能性があることをお詫び申し上げます(それに対する答えを見つけることができませんでした):

可変長配列の割り当てが正常に完了したことを確認する必要がありますか?

例えば:

void func(int size)
{
    int arr[size];
    if (arr == NULL)
    {
        // Exit with a failure
    }
    else
    {
        // Continue as planned
    }
}

答えがyesであることは明らかですが、構文arr == NULLは少し変わっているように感じます。

ありがとう


アップデート:

上記のコードがコンパイルされることさえ確認していないという事実を認めます (コンパイルされると仮定します)。

コンパイルされない場合は、可変長配列の割り当てをアサートする方法がないことを意味します。

したがって、割り当てが失敗すると、プログラムはすぐにクラッシュすると思います。

プログラムが不正なメモリ アクセス (読み取りまたは書き込み) の後にクラッシュするのは理にかなっていますが、メモリの割り当てが失敗した後ではないため、これは非常に厄介なケースです。

または、割り当てによって何も起こらないかもしれませんが、スタックの外側に「落ちる」エントリで配列にアクセスするとすぐに、メモリアクセス違反が発生する可能性があります (スタックオーバーフローのように)...?

正直なところ、VLA にさらにローカル変数 (特に他の VLA) が続く場合、VLA がスタックにどのように割り当てられるかさえわかりません。そのため、その問題についても回答をいただければ幸いです。

4

1 に答える 1