- 締切済み
C言語のローカル変数初期化について
ローカル変数の初期化を実施していない場合、 その変数をファイル出力するとゴミデータが出力されます。 これは仕様通りだと思います。 さて、初期化を実施していないにもかかわらず、 偶然ですが、ファイル出力時はスペース出力されていたプログラムがあります。 このプログラムを別サーバーに持っていって動かしたところ、 ゴミデータが出力されました。 対応としては、プログラムを改修しましたが、 以前、スペース出力でずっと稼動していたプログラムが 別サーバーでは、ゴミデータ出力となる原因はなんでしょうか? 初期化を実施しない場合、ローカル変数は不定になることはわかりますが、 それだけでは、ずっとスペース出力されつづけていた理由が説明できない ような気がしています。 ご存知の方、よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- RITYABOU
- ベストアンサー率26% (4/15)
auto の領域としてスタックが使用されている事を理解しているという前提で 話を薦めます。 同じオブジェクトでスタックの内容が異なってしまう事で 最も多い原因はシェアオブジェクトのバイナリが異なっている事です。 真の原因はデバッガなので調べないといけません。
- haporun
- ベストアンサー率40% (230/562)
引っ越した先に、以前住んでいた人が家具を残していったようなもんです。 これを利用すると、個人データとかが出てくることもあるかもね!
- ymmasayan
- ベストアンサー率30% (2593/8599)
質問の答えとして適当かどうかわかりませんが、過去に経験した例では OS(実際にはローダ)によって、未使用エリアの処置が違う事があります。 ローディング時、未使用エリアをクリアーする例と、何もしない例があります。 当然、初期化を忘れたときの動きは違いますが、どちらも仕様に違反していない ので文句は言えません。初期化を忘れた人が悪いのです。親切なものでは、 わざと乱数みたいなものを埋めてくれる例もあります。
- a-kuma
- ベストアンサー率50% (1122/2211)
> それだけでは、ずっとスペース出力されつづけていた理由が説明できない > ような気がしています。 ある程度 C の仕組みを分かっている、との前提で回答します。 auto の変数は、通常スタックに取られます。スタックは、使い終わった後は、 書き込む位置(スタックポインタが指す場所)が変わるだけで、内容は変わりません。 今、問題になっている関数を呼び出す前の状態、というのは、それ以前の関数での 処理の内容に依存します。 { func_A(); /* ここでの、スタックの内容は func_A() に依存します */ func_B(); /* おかしいなあ、と思っている関数 */ } 例えば、以下のようなプログラムを動かしてみてください。 #include <stdio.h> int func_A() { int i; i = 20; return 0; } int func_B() { int j; printf("%d\n", j); return 0; } int main(void) { func_A(); func_B(); return 0; } サイズもぴったり合っていると、こういうふうになります。 これが、構造体などを使った場合、実メモリに配置されるバイト境界が環境に よってことなるので、同じプログラムなのに、動作が違う、なんてことがありえます。 上記の例では、func_A() の auto 変数の型を以下のように変えてみると 動作が変わるでしょう。 int func_A() { struct { char x; char y; } i; i.x = 0; i.y = 20; return 0; } # 後は、エンディアンネスによっても変わってきます
- TMINET
- ベストアンサー率32% (45/140)
全く同じ環境(ハード、OS、動作アプリ)にならない限りメモリのロケーションも同じにはならないと思います。 OSの処理系や搭載されているCPUによってさまざまですから、スペースが出力されていたのは偶然の産物としか言えません。