C言語における変数の暗黙的な初期化 ― 0と1はどこから来るのか?
C言語では、変数を使用する前に必ず宣言しなければならないのが基本ルールです。しかし実際には、宣言や明示的な代入を行っていないのに、変数に0や1が自動的に格納されていることがあります。
この現象は「暗黙的な初期化」と呼ばれます。C言語の仕様では、グローバル変数やstatic変数は、明示的に初期化しなくてもプログラム起動時に自動的に0で初期化されるためです。
サンプルコード①:グローバル変数の暗黙的な初期化
#include <stdio.h>
#include <stdlib.h>
x, y, array[3]; // 型指定なしで宣言されたグローバル変数(暗黙的に初期化される)
int main(i) {
// 引数 i には 1 が格納される
int index;
printf("x = %d, y = %d\n\n", x, y);
for(index = 0; index < 3; index++)
printf("Array[%d] = %d\n", i, array[i]);
printf("The value of i : %d", i);
}
実行結果
x = 0, y = 0 Array[0] = 0 Array[1] = 0 Array[2] = 0 The value of i : 1
解説
上記のコードでは、x、y、arrayは型指定子を省略して宣言されたグローバル変数です。どこにも値を代入していないにもかかわらず、すべて0が出力されています。これは、グローバル変数がBSSセクションと呼ばれるメモリ領域に配置され、プログラムの開始時に自動的にゼロで初期化されるためです。
一方、main関数の引数 i には 1 が格納されています。main関数の第一引数は通常 argc(コマンドライン引数の個数)を表し、プログラム名そのものも引数としてカウントされるため、最低でも 1 以上になるのです。
配列の部分的な初期化
もうひとつ興味深い挙動として、配列を一部の値だけで初期化すると、残りの要素には自動的に0が代入されます。次の例で確認してみましょう。
#include <stdio.h>
#include <stdlib.h>
int main() {
int index;
int array[10] = {1, 2, 3, 4, 5, 6}; // 先頭6要素のみ初期化
for(index = 0; index < 10; index++)
printf("Array[%d] = %d\n", index, array[index]);
}
実行結果
Array[0] = 1 Array[1] = 2 Array[2] = 3 Array[3] = 4 Array[4] = 5 Array[5] = 6 Array[6] = 0 Array[7] = 0 Array[8] = 0 Array[9] = 0
まとめ
- グローバル変数・static変数:明示的に初期化しなくても、自動的に0で初期化される。
- main関数の第一引数:コマンドライン引数の個数を表すため、常に1以上となる。
- 配列の部分的な初期化:一部の要素だけ値を指定した場合、残りの要素は自動的に0で埋められる。
ただし注意点として、関数内で宣言されたローカル変数(自動変数)は自動的に初期化されません。そのため、不定値(ガーベジ値)が入る可能性があり、予期しないバグの原因となります。安全なプログラムを書くためにも、変数は宣言の時点で明示的に初期化しておく習慣をつけるとよいでしょう。
-
JavaScriptの分割代入(デストラクチャリング)で変数を入れ替える方法
分割代入(デストラクチャリング)を使うことで、変数の入れ替え(スワップ)は非常に簡単になりました。従来のJavaScriptでは、別の一時変数を用意して入れ替え処理を行うのが一般的でした。動作自体に問題はありませんが、コードが長くなりやすいという課題がありました。一方、モダンJavaScriptでは第3の変数を用意する必要すらありません。本記事では、その方法を詳しく解説します。 例1:一時変数を使った従来の方法 次の例では、「tmp」という一時変数を使って変数aとbを入れ替えています。余分な変数が必要になるため、どうしてもコードが長くなってしまいます。 <html> <bo
-
JavaScriptでCSS変数を取得・設定する方法
JavaScriptを活用すると、CSS変数(カスタムプロパティ)の値を動的に読み取ったり、書き換えたりすることができます。ポイントになるのは、次の3つのメソッドです。 1. getComputedStyle() ― 適用済みスタイルの取得 getComputedStyle()メソッドは、対象の要素に実際に適用されているすべてのスタイル情報を含むオブジェクトを返します。このオブジェクトには、CSS変数の値も含まれています。 2. getPropertyValue() ― 目的のプロパティ値の取得 getComputedStyle()が返したオブジェクトに対してgetPropertyVal