2

私はC90でこれを行うことになっていないことを知っています、そしてそれはかなり基本的なことです。

char name[strlen(s)];

ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’

彼らは私にmallocを具体的に使用してほしかったのですか?私はここでその背後にあるロジックについて好奇心をそそられています。

4

4 に答える 4

9

C90は可変長配列(VLA)をサポートしていないため、禁止されています。それは本当にそれと同じくらい簡単です。

オプションは次のとおりです。

  • 処理する最大文字列長に対応できる固定長配列を宣言します。
  • 動的に-配列を割り当てます(を使用してmalloc)。
  • VLAに非標準の言語拡張機能(GCCなど)を提供するコンパイラーを使用します。(これは、移植性のないコードを書くことになるので、お勧めしません。)
  • 代わりに、VLAがサポートされているC99を使用してください。VLAはスタックに割り当てられるため、スタックスペースが不足すると、あらゆる種類の問題が発生する可能性があることに注意してください(とは異なりmalloc、割り当てが成功したことを確認できるという概念はありません)。

[注:のコピーを作成するために配列を割り当てる場合は、サイズとしてs使用する必要がありますstrlen(s)+1(ヌルターミネータを覚えておいてください)。]

于 2011-12-21T20:58:09.383 に答える
1

「彼ら」があなたにそれをしてほしくないというわけではありません、それは単に言語の一部ではありません(あるいは、1999年以前ではありませんでした)。標準の回避策は、mallocまたはを使用することallocaです。(alloca基本的に可変長配列割り当てと同じですが、標準機能ではないため、対象のすべてのシステムで使用できるわけではありません。また、一部の人々はその使用に強い反対を持っていますが、可変長に強い反対をする傾向があります同じ理由でアレイ。)

于 2011-12-21T21:01:33.650 に答える
0

この警告は、GNUgcc拡張機能の使用が深刻な移植性の問題であることを示しています。

strlen(s)の値はコンパイル時に不明であるため、コードは不正です。GNU gccは、実行時の値に基づいて割り当てる自動配列の拡張機能を提供します。ただし、これらに依存すると、コードが標準に準拠しなくなります。

strlen(s)の値が実行時までわからない場合は、規則配列で明示的に割り当て/割り当て解除を実行するように変換するか、STLコンテナーを使用することで、コードを準拠させることができます(例:std :: vector )。

于 2011-12-21T21:00:57.380 に答える
0

これは、コンパイラの推定される利便性とその意図されたランタイム環境に制限がある言語の問題です。

于 2011-12-21T21:03:39.097 に答える