21

どうすればこれを回避できるのか、私はいつも疑問に思っていました:

int main(int argc, char **argv) {
    printf("%p %s %d\n", &argv[1], argv[1], strlen(argv[1]));
    char copy[strlen(argv[1]) + 1];
    strcpy(copy, argv[1]);
    printf("%p %s %d\n", &copy, copy, strlen(copy));
    return 0;
}

とにかくchar配列copyが割り当てられ、プログラムは正常に実行され、元とコピーが出力されます。そしてヴァルグリンドは何も文句を言わない。

C では malloc なしでは動的配列は不可能だと思っていました。私は間違っていましたか?

4

4 に答える 4

18

これは C99 の機能であり、以前のバージョンではコンパイラによって実装できました。

可変長の自動配列は ISO C99 で許可されており、拡張として GCC は C90 モードと C++ でそれらを受け入れます。これらの配列は、他の自動配列と同様に宣言されますが、長さが定数式ではありません。ストレージは宣言の時点で割り当てられ、ブレースレベルが終了すると割り当てが解除されます。

于 2011-07-11T21:25:21.373 に答える
7

可変長配列はGCC拡張として始まりましたが、 C99でも採用されました。

それらはまだスタックに割り当てられているので、それらを「巨大」にすることは悪いスタイルと見なされます(そしていつかあなたに壊れる可能性があります)。

于 2011-07-11T21:26:07.787 に答える
4

「可変長配列」が存在する前でさえ、gcc と C99 のおかげで、次のものがありました。

alloca()-- これにより、スタック (「自動」) メモリの動的割り当てが可能になります。

于 2011-07-11T21:52:29.527 に答える
2

C99でC言語に「可変長配列」が追加されました。これは§6.7.5.2「配列宣言子」でカバーされています。

size が整数定数式ではない式の場合: 関数プロトタイプ スコープでの宣言内にある場合は、* に置き換えられたものとして扱われます。それ以外の場合は、評価されるたびにゼロより大きい値になります。可変長配列型の各インスタンスのサイズは、その存続期間中は変更されません。サイズ式が sizeof 演算子のオペランドの一部であり、サイズ式の値を変更しても演算子の結果に影響しない場合、サイズ式が評価されるかどうかは未指定です。

于 2011-07-11T21:25:55.577 に答える