私はC90でこれを行うことになっていないことを知っています、そしてそれはかなり基本的なことです。
char name[strlen(s)];
ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’
彼らは私にmallocを具体的に使用してほしかったのですか?私はここでその背後にあるロジックについて好奇心をそそられています。
C90は可変長配列(VLA)をサポートしていないため、禁止されています。それは本当にそれと同じくらい簡単です。
オプションは次のとおりです。
malloc
)。malloc
、割り当てが成功したことを確認できるという概念はありません)。[注:のコピーを作成するために配列を割り当てる場合は、サイズとしてs
使用する必要がありますstrlen(s)+1
(ヌルターミネータを覚えておいてください)。]
「彼ら」があなたにそれをしてほしくないというわけではありません、それは単に言語の一部ではありません(あるいは、1999年以前ではありませんでした)。標準の回避策は、malloc
またはを使用することalloca
です。(alloca
基本的に可変長配列割り当てと同じですが、標準機能ではないため、対象のすべてのシステムで使用できるわけではありません。また、一部の人々はその使用に強い反対を持っていますが、可変長に強い反対をする傾向があります同じ理由でアレイ。)
この警告は、GNUgcc拡張機能の使用が深刻な移植性の問題であることを示しています。
strlen(s)の値はコンパイル時に不明であるため、コードは不正です。GNU gccは、実行時の値に基づいて割り当てる自動配列の拡張機能を提供します。ただし、これらに依存すると、コードが標準に準拠しなくなります。
strlen(s)の値が実行時までわからない場合は、規則配列で明示的に割り当て/割り当て解除を実行するように変換するか、STLコンテナーを使用することで、コードを準拠させることができます(例:std :: vector )。
これは、コンパイラの推定される利便性とその意図されたランタイム環境に制限がある言語の問題です。