重複の可能性:
Cのint配列の初期値
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char name[10];
printf("%s\n", name);
return 0;
}
Cの初期化されていない文字列はどのような値を保持しますか?コンパイラーは自動的にサイズ10のストレージを割り当て、それをガベージ値で埋めますか?上記のコードを書くと基本的に何が起こりますか?
重複の可能性:
Cのint配列の初期値
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char name[10];
printf("%s\n", name);
return 0;
}
Cの初期化されていない文字列はどのような値を保持しますか?コンパイラーは自動的にサイズ10のストレージを割り当て、それをガベージ値で埋めますか?上記のコードを書くと基本的に何が起こりますか?
スタックには 10 バイトが割り当てられます。それだけです。それらの値はそのまま残されます。つまり、割り当てられる前にそのような 10 バイトに書き込まれたものです。
文字列が初期化されていないため、値は定義されていません。値は何でもかまいません。また、初期化されていない文字列には終端のゼロ文字がないため、出力するのは安全ではないと思います。したがって、理論的には、10 文字を超える文字を出力することになる可能性があります。
そして別のこと -Cストレージを何も埋めません。そのままにしておくだけです。
編集: 終了文字が 0 である限り、初期化されていない文字列に安全にアクセスできると言っているわけではないことに注意してください。未定義の動作を呼び出すことは、未定義であるため安全ではありません。何が起こるかわかりません。
ガベージ (ランダム) 値が含まれています。理解を深めるために、ストレージ クラスの詳細を参照してください。
初期化されていない変数の内容は、たとえば Java 以外では未定義です。つまり、コンテンツは、他のメソッド呼び出しのために最近スタックにプッシュされた値で構成されます。
あなたの特定の例では、おそらくゼロになるでしょう。しかし、それは問題ではありません。
重要な点は、undefinedだということです。常に同じであると信頼できない場合、それは役に立ちません。仮定を立てることはできません。コードの他の部分はそれに依存できません。存在しなかったようなものです。
実際のコンテンツがどこから来るのか知りたい場合は、それらはスタックに格納された以前の実行コンテキストの残りです。いくつかの関数呼び出しを実行すると、プログラムが自由に上書きできるようにガベージが放置されることになります。これらの上書きにのみ適したバイトは、文字列になる可能性があります。
C 標準では、「未指定」という用語を使用しています。つまり、何でもかまいません。実生活では、ランダムなガベージでいっぱいになる可能性が高く、運が悪いと、終端のゼロバイトがないため、未定義の動作を呼び出して、おそらく への呼び出しprintf()がクラッシュします (セグメンテーション違反、誰か?) .