先頭へ戻る

配列の全要素を 0 で埋める | Programming Place Plus C言語編 逆引き

Programming Place Plus トップページ -- C言語編 -- 逆引き

先頭へ戻る

この章の概要

この章の概要です。

目的

定義済みの配列のすべての要素に、0 を入れたいとします。

#include <stdio.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = {0, 1, 2, 3, 4};

    // array[0]~array[4] まで、すべてを 0 にしたい

    return 0;
}

SIZE_OF_ARRAYマクロは、配列の要素数を取得するものです。詳細は「逆引き 配列の要素数を求める」を参照してください。

0以外の値で埋める方法は、「逆引き 配列の全要素を同じ値で埋める」を参照してください。

方法①(for文で1つずつ代入する)

for文を使って、要素1つ1つに順番に 0 を代入していきます。

非常に単純な方法ですが、実のところ、これが一番確実です。

#include <stdio.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = {0, 1, 2, 3, 4};

    for (size_t i = 0; i < SIZE_OF_ARRAY(array); ++i) {
        array[i] = 0;
    }

    for (size_t i = 0; i < SIZE_OF_ARRAY(array); ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

実行結果:

0 0 0 0 0 

この方法は、0 が代入できる型であれば、要素の型を問わずうまく動作します。また、代入する値が 0 以外であっても同じ方法が使えます。

方法②(memset関数を使う ※限定的な方法)

memset関数を使うと、メモリの範囲を同じ値で埋めることができるため、これを使って、すべての要素を 0 で埋める方法があります。

まず、サンプルプログラムを挙げます。

#include <stdio.h>
#include <string.h>

#define SIZE_OF_ARRAY(array)    (sizeof(array)/sizeof(array[0]))

int main(void)
{
    int array[] = {0, 1, 2, 3, 4};

    memset(array, 0, sizeof(array));

    for (size_t i = 0; i < SIZE_OF_ARRAY(array); ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

実行結果:

0 0 0 0 0 

memset関数を使って 0 で埋める方法がうまくいくのは、要素が整数型の場合に限られます。

たとえば、浮動小数点型においては、バイトが「0」で埋められている状態が、0.0 を意味しているかどうかは処理系依存です。同様に、ポインタ型においては、バイトが「0」で埋められている状態が、ヌルポインタであることを意味しているかどうかは処理系依存です。

ソースコードのレベルでは、浮動小数点型に対する「0」は 0.0 のことですし、ポインタ型に対する「0」はヌルポインタ定数のことですが、memset関数はそういった考慮は一切せず、単にメモリの範囲を埋めるだけの動作なのです。

とくに、配列を定義する時点で 0 で埋めておけるのなら、「int array[5] = {0};」のように、初期化する方法を選ぶべきです。この方法なら、要素の型が浮動小数点型であろうと、ポインタ型であろうと、確実にうまくいきます。


参考リンク


更新履歴

'2019/9/2 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー