![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ローカル変数の初期化を実施していない場合、
その変数をファイル出力するとゴミデータが出力されます。
これは仕様通りだと思います。
さて、初期化を実施していないにもかかわらず、
偶然ですが、ファイル出力時はスペース出力されていたプログラムがあります。
このプログラムを別サーバーに持っていって動かしたところ、
ゴミデータが出力されました。
対応としては、プログラムを改修しましたが、
以前、スペース出力でずっと稼動していたプログラムが
別サーバーでは、ゴミデータ出力となる原因はなんでしょうか?
初期化を実施しない場合、ローカル変数は不定になることはわかりますが、
それだけでは、ずっとスペース出力されつづけていた理由が説明できない
ような気がしています。
ご存知の方、よろしくお願い致します。
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で質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Ruby プログラミング 3 2023/06/09 14:30
- Windows 10 パソコンが使えず困ってます!(Microsoftアカウントでログイン後、PINコードに関するエラー) 2 2023/03/17 19:09
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FORTRANの出力データの左寄せが...
-
C言語での印刷方法
-
C言語でMS-DOSプロンプト入力で...
-
コマンド(例えばls)の出力結果...
-
windowsでテキストファイルの比...
-
ファイルの文字コードをUTF-8に...
-
Wordマクロで指定したフォルダ...
-
サウンド出力のデバイスを選択...
-
アクセス>マクロ>テキスト変換
-
VB.NETでExcelファイルを出力す...
-
1行ずつではなくまとめてファイ...
-
C言語 ファイル処理に関するプ...
-
C++ fprintf_sの使い方がわからん
-
音を出すプログラム
-
外国語とCSVについて
-
C言語 ドラッグとファイル名の表示
-
半年以上前のファイルの時刻表示
-
CSVに書き出すVBSとHTA
-
(VBA)書式が変更されてしまい...
-
ファイル出力の場所を指定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Paiza Cloudです。 どうやれば...
-
Paiza Cloudです。学籍番号と氏...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
ファイル形式またはファイル拡...
-
fortranのtxtファイル出力書式...
-
CSV形式に変換
-
printfだと出力されるのにfprin...
-
C++ fprintf_sの使い方がわからん
-
c言語の質問です。 ランダムに4...
-
Wordマクロで指定したフォルダ...
-
C++/CLIにて、System.String^型...
-
pcap形式データをテキストへ抽出
-
二次元配列をクリップボードに...
-
raw形式からbmp形式への書き込...
おすすめ情報