int i;
ここで、変数 i が宣言され、メモリが割り当てられますが、初期化されません。
extern int i;
extern が使用されるときはいつでも、変数は宣言されるだけで、メモリは割り当てられません。それにアクセスするには、同じ変数を外部で再宣言する必要があります。ここでexternはそれを指し、プログラム(外部ソース)の外部でその変数(i)の値を定義します。あなたの場合は、内部で行うため、期待どおりに機能しません。メインプログラムの外部または外部プログラムによって定義できます。
これを試して:
#include<stdio.h>
int main()
{
extern int i; //Declared but memory not allocated
printf("%d",i);
return 0;
}
int i=20; //Allocated memory for i and initialized to 20 outside the prog
出力:
20
グローバル extern 変数は直接初期化することもできますが、ローカル extern 変数は初期化できません。
#include<stdio.h>
extern int i=10; //Declared, Memory allocated and defined.
int main()
{
extern int j; //Declared but memory not allocated
printf("%d --> %d",i,j);
return 0;
}
int j=20; //Memory Allocated and value defined externally.
出力:
10 --> 20
詳細については、このリンクを参照することもできます。