May
29
この技巧は人気がある。ただしDennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。公式な解釈によると上の技巧は Cの 規格に厳密には準拠していないと考えられる。(この技法が正しいか どうかを取り巻く議論を尽くすことは、このFAQの守備範囲を越えて いる。) しかし世の中に知られている全てのコンパイラの実装で、こ の方法は移植性が高いようである(配列の境界を注意深くチェックす るコンパイラは警告を出すかもしれない)。
別のやり方としては、可変長の要素の大きさを、小さく取るより、非 常に大きく取ることが考えられる。上の例でいえば、
2.6:
配列namestrが複数の要素を持つように振る舞わせるために構造体を
以下のように宣言して、巧妙にメモリ割り当てをしている以下のよう
なコードを見かけた。このコードは許されるのか。移植性は高いのか。
A:
- struct name {
- int namelen;
- char namestr[1];
- };
この技巧は人気がある。ただしDennis Ritchieは「Cの実装への根拠 のない馴れ馴れしさ」と呼んだ。公式な解釈によると上の技巧は Cの 規格に厳密には準拠していないと考えられる。(この技法が正しいか どうかを取り巻く議論を尽くすことは、このFAQの守備範囲を越えて いる。) しかし世の中に知られている全てのコンパイラの実装で、こ の方法は移植性が高いようである(配列の境界を注意深くチェックす るコンパイラは警告を出すかもしれない)。
別のやり方としては、可変長の要素の大きさを、小さく取るより、非 常に大きく取ることが考えられる。上の例でいえば、
…ここでMAXSIZEは配列namestrに保存されうるどんな名前よりも大きい。 しかしながらこの技法も、規格の厳密な解釈によると許されないよう だ。 C FAQ 2
char namestr[MAXSIZE];
…