[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.14 可変長配列

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.