2017-04-14 5 views
-3
#include<stdio.h> 
void func(); 

void func() 
{ 
int y; 
y=y+2; 
printf("%d",y); 
} 

int main() 
{ 
func(); 
func(); 
return 0; 
} 

func()が2回目に呼び出されたときに、なぜ24が印刷されるのですか?変数yは終了する必要がありますか?それが宣言されていないのになぜ静的変数のように振る舞うのですか?なぜデフォルトでは、varibaleはcでstaticとして宣言されていますか?

+5

あなたのコードは未定義の動作を生成しています。コンパイラはあなたに警告する必要があります。 –

答えて

4

未定義の動作未初期化ローカル変数です。

値が割り当てられる前に自動記憶変数を使用した場合、その記憶域は以前に保持していたものを保持する可能性があり、そのため変数の内容は予測できません。

C規格は6.3.2.1 P2である:左辺値は がレジスタ記憶クラスで宣言されている可能性があること自動記憶域期間のオブジェクトを指定した場合

(そのアドレスが取られ 持っていなかった)、およびそのオブジェクトは初期化されていません( はイニシャライザでは宣言されておらず、使用する前に を実行していません)、動作は定義されていません。だから、

だけで作成した後、あなたが変数を初期化する場合は、より良い、などが:機能func内で初期化されていない変数yが使用されているので

void func() 
{ 
int y = 0; 
     ^^^ 
y=y+2; 
printf("%d",y); 
} 
+0

ありがとう!!それは働いた –

+0

しかし、デフォルトでは、常に0に初期化されています –

0

プログラムの動作は未定義ました。質問については

void func() 
{ 
int y; 
^^^^^^ 
y=y+2; // using an uninitialized variable 
printf("%d",y); 
} 

、関数は他のいくつかの機能によって上書きされなかった同じメモリを使用することができます。したがって、メモリに格納された値は関数呼び出しの間で同じになる可能性があります。

関連する問題