[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU C では可変長の自動変数配列を使うことができる。 この配列は、普通の自動配列と同じように宣言するが、長さ指定が 定数式でないところが違う。 メモリは宣言のある場所で確保され、それが属するブロックを抜けるときに 解放される。以下に例を示す。
FILE * concat_fopen (char *s1, char *s2, char *mode) { char str[strlen (s1) + strlen (s2) + 1]; strcpy (str, s1); strcat (str, s2); return fopen (str, mode); } |
配列名の有効範囲から、ジャンプや break で抜けると、配列名に割り当て られているメモリは解放される。配列名の有効範囲にジャンプしてくるのは 許されず、エラーになる。
関数 alloca
を使えば、可変長配列と同じような効果を得ることが
できる。alloca
は、多くの C の処理系で利用可能である
(が、全ての処理系で利用可能なわけではない)。
一方、可変長配列の方がエレガントである。
この二つの方法には他にも違いがある。
allocal
で確保した領域はその関数がリターンするまで存在し続ける。
可変長配列の領域の方は、配列名のスコープを抜けた瞬間に解放される。
(ある一つの関数で、可変長配列とalloca
の両方を使った場合、
ある可変長配列を解放すると、その可変長配列の確保以後に alloca
で
確保された領域も全て解放される。)
可変長配列を関数の引数として使うこともできる。
struct entry tester (int len, char data[len][len]) { … } |
配列の長さは、メモリが確保されるときに一回だけ計算され、その配列の
有効範囲内では記憶されており、sizeof
で参照することができる。
最初に配列を渡し、長さは後から渡したい場合は、仮引数のリストで 前方宣言を行なえば良い。これももう一つ別の GNU の拡張機能である。
struct entry tester (int len; char data[len][len], int len) { … } |
セミコロンの前の ‘int len’ が 仮引数の前方宣言である。
これは、data
の宣言をパースするときに len
という名前を
既知のものとする役割を果たす。
仮引数リストには、こういう前方宣言を幾つ書いても良い。 前方宣言は、カンマまたはセミコロンを使って区切る。 ただし、最後の前方宣言はセミコロンで終わっていなければならず、 その後に「本物の」仮引数リストが続く。 どの前方宣言も、「本物の」仮引数宣言の名前とデータ型に一致 しなければならない。
This document was generated
using texi2html 1.78.