2016-08-23 6 views
1

私はコンパイルしてC、char配列にランダムな文字があるのはなぜですか?

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

int main() 
{ 
    char func[16]; 
    for(int i = 0; i < sizeof(func); i++) { 
     printf("Char %d in func is %c\n", i, func[i]); 
    } 
    return 0; 
} 

に次のように実行すると、私はこの取得:

Char 0 in func is P 
Char 1 in func is 
Char 2 in func is @ 
Char 3 in func is 
Char 4 in func is 
Char 5 in func is 
Char 6 in func is 
Char 7 in func is 
Char 8 in func is p 
Char 9 in func is 
Char 10 in func is @ 
Char 11 in func is 
Char 12 in func is 
Char 13 in func is 
Char 14 in func is 
Char 15 in func is 

を、私は異なる時間にコンパイルするときに、私は私のchar型の配列に異なるランダムな文字を取得します。これは、ポインタが削除されたメモリ内のランダムなASCII文字を検出するためですが、実際の情報はヒープに残っているためです。

forループで配列内のすべてをnullに設定する必要がありますか、それを行う関数はありますか?

+1

ヒープには何もありません – StoryTeller

+1

オブジェクトの値を使用するための未定義の動作です。 – EOF

+2

初期化されていないデータは、初期化されていないデータです。 –

答えて

7

配列のような初期化されていないローカル非静的変数funcは、不確定の値です。初期化せずにこれらを使用するとundefined behaviorになりました。

実際には、プログラムを実行する瞬間に内容がメモリに格納されます。一見するとランダムです。

+0

コンパイラは初期化されていないローカル非静的変数を0に設定すべきですか?少なくともコンパイラではないのですか? – CIsForCookies

+2

@noob C標準からのそのような要件はありません。 – StoryTeller

+3

@noobコンパイラがそれをしているなら、それはC仕様で指定されていない何かをしています。しかし、デバッガで実行するときにポインタを使うと、微妙なバグが隠れてしまうことがあります(ポインタはデバッガでは 'NULL'になります。初期化されていないポインタ)。 –

関連する問題