このページの解説は C99 をベースとしています。
以下は目次です。
定義済みの配列のすべての要素に、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 にしたい
}
SIZE_OF_ARRAYマクロは、配列の要素数を取得するものです。詳細は「逆引き 配列の要素数を求める」を参照してください。
0以外の値で埋める方法は、「逆引き 配列の全要素を同じ値で埋める」を参照してください。
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) {
[i] = 0;
array}
for (size_t i = 0; i < SIZE_OF_ARRAY(array); ++i) {
("%d ", array[i]);
printf}
("\n");
printf}
実行結果:
0 0 0 0 0
この方法は、0 が代入できる型であれば、要素の型を問わずうまく動作します。また、代入する値が 0 以外であっても同じ方法が使えます。
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};
(array, 0, sizeof(array));
memset
for (size_t i = 0; i < SIZE_OF_ARRAY(array); ++i) {
("%d ", array[i]);
printf}
("\n");
printf}
実行結果:
0 0 0 0 0
memset関数を使って 0 で埋める方法がうまくいくのは、要素が整数型の場合に限られます。
たとえば、浮動小数点型においては、バイトが「0」で埋められている状態が、0.0 を意味しているかどうかは処理系依存です。同様に、ポインタ型においては、バイトが「0」で埋められている状態が、ヌルポインタであることを意味しているかどうかは処理系依存です。
ソースコードのレベルでは、浮動小数点型に対する「0」は 0.0 のことですし、ポインタ型に対する「0」はヌルポインタ定数のことですが、memset関数はそういった考慮は一切せず、単にメモリの範囲を埋めるだけの動作なのです。
特に、配列を定義する時点で 0 で埋めておけるのなら、「int array[5] = {0};」のように、初期化する方法を選ぶべきです。この方法なら、要素の型が浮動小数点型であろうと、ポインタ型であろうと、確実にうまくいきます。
return 0;
を削除(C言語編全体でのコードの統一)新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |