ローカル変数の初期化を実施していない場合、
その変数をファイル出力するとゴミデータが出力されます。
これは仕様通りだと思います。
さて、初期化を実施していないにもかかわらず、
偶然ですが、ファイル出力時はスペース出力されていたプログラムがあります。
このプログラムを別サーバーに持っていって動かしたところ、
ゴミデータが出力されました。
対応としては、プログラムを改修しましたが、
以前、スペース出力でずっと稼動していたプログラムが
別サーバーでは、ゴミデータ出力となる原因はなんでしょうか?
初期化を実施しない場合、ローカル変数は不定になることはわかりますが、
それだけでは、ずっとスペース出力されつづけていた理由が説明できない
ような気がしています。
ご存知の方、よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
> それだけでは、ずっとスペース出力されつづけていた理由が説明できない
> ような気がしています。
ある程度 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;
}
# 後は、エンディアンネスによっても変わってきます
No.5
- 回答日時:
auto の領域としてスタックが使用されている事を理解しているという前提で
話を薦めます。
同じオブジェクトでスタックの内容が異なってしまう事で
最も多い原因はシェアオブジェクトのバイナリが異なっている事です。
真の原因はデバッガなので調べないといけません。
No.3
- 回答日時:
質問の答えとして適当かどうかわかりませんが、過去に経験した例では
OS(実際にはローダ)によって、未使用エリアの処置が違う事があります。
ローディング時、未使用エリアをクリアーする例と、何もしない例があります。
当然、初期化を忘れたときの動きは違いますが、どちらも仕様に違反していない
ので文句は言えません。初期化を忘れた人が悪いのです。親切なものでは、
わざと乱数みたいなものを埋めてくれる例もあります。
No.1
- 回答日時:
全く同じ環境(ハード、OS、動作アプリ)にならない限りメモリのロケーションも同じにはならないと思います。
OSの処理系や搭載されているCPUによってさまざまですから、スペースが出力されていたのは偶然の産物としか言えません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
C言語での縦方向のファイル出力...
-
VC++でUTF-8のファイルを出力し...
-
ファイル形式またはファイル拡...
-
Wordマクロで指定したフォルダ...
-
アクセス>マクロ>テキスト変換
-
標準出力とファイルに効率的に...
-
UNIX & Linux の標準出力で得た...
-
Excel のページを Jpegファイル...
-
VBAでエクセルをCSVに変換時
-
Accessでのレポート印刷待機方法
-
csvファイルでの出力について
-
テキストファイルに改行コード...
-
C言語による10進数→16進数変換...
-
外国語とCSVについて
-
コマンドライン引数の区別【C言...
-
CSVファイルを任意の場所に出力...
-
AccessVBA複数レポート条件毎に...
-
シェルコマンドの 2>&1 とはど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
ファイル形式またはファイル拡...
-
外国語とCSVについて
-
Wordマクロで指定したフォルダ...
-
AccessVBA複数レポート条件毎に...
-
CreateProcess関数と実行後の戻...
-
pcap形式データをテキストへ抽出
-
テキストファイルに改行コード...
-
ファイル比較について
-
ファイルの文字コードをUTF-8に...
-
CSV形式に変換
-
サウンド出力のデバイスを選択...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
C++ fprintf_sの使い方がわからん
-
VBA でメモ帳へ保存する際の保...
-
VB.NETでExcelファイルを出力す...
-
アクセス>マクロ>テキスト変換
おすすめ情報