C言語は関数の仮引数に "..." を指定することで,可変長引数 (variable arguments) を受け取ることができます.受け取った可変長引数は,stdarg.h の va_start マクロ,va_arg マクロ,va_end マクロのそれぞれを使用することで利用することができます.
#include <stdarg.h>
va_start
void va_start(va_list ap, 最終仮引数);
va_arg
型 va_arg(va_list ap, 型);
va_end
void va_end(va_list ap);
受け取った可変長引数は,まず va_start マクロを使用して初期化し,va_arg マクロを使用して取り出します.使用後は va_end マクロを使用することで,関数から正常に復帰できるようにします.
以下にメモリ領域を確保し,可変長引数を用いてそのメモリ領域を初期化するサンプルプログラムを示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
/* functions */
int *CreateArray(int count, ...);
/* main */
int main(void) {
int i;
int *array;
/* メモリ領域を確保し,可変長引数で指定された値で初期化する */
if ((array = CreateArray(3, 1, 2, 3)) == NULL) {
fprintf(stderr, "メモリ領域の確保に失敗しました.\n");
return EXIT_FAILURE;
}
/* 表示 */
printf("array: ");
for ( i = 0; i < 3; i++ ) {
printf("%d ", array[i]);
}
printf("\n");
return EXIT_SUCCESS;
}
/**
* メモリ領域を確保し, 可変長引数で指定された値で初期化する
* @param[in] count 可変長引数の数
* @param[in] ... 初期化用の値
* @return 確保したメモリ領域へのポインタ
*/
int *CreateArray(int count, ...) {
va_list ap;
int i;
int *array;
/* メモリ領域の確保 */
if ((array = (int *)malloc(sizeof(int) * count)) == NULL) {
/* error */
return NULL;
}
va_start(ap, count);
for ( i = 0; i < count ; i++ ) {
array[i] = va_arg(ap, int);
}
va_end(ap);
return array;
}
サンプルプログラムの実行結果は以下のようになります.
array: 1 2 3
たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.