ホームC言語Tips集関数 ≫ 可変長引数を持つ関数を作成する

C言語Tips集 - 可変長引数を持つ関数を作成する

C言語は関数の仮引数に "..." を指定することで,可変長引数 (variable arguments) を受け取ることができます.受け取った可変長引数は,stdarg.hva_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 マクロを使用することで,関数から正常に復帰できるようにします.

C言語サンプルプログラム

以下にメモリ領域を確保し,可変長引数を用いてそのメモリ領域を初期化するサンプルプログラムを示します.

/* 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言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.

関数の作成と呼び出し