
ローカル変数の初期化を実施していない場合、
その変数をファイル出力するとゴミデータが出力されます。
これは仕様通りだと思います。
さて、初期化を実施していないにもかかわらず、
偶然ですが、ファイル出力時はスペース出力されていたプログラムがあります。
このプログラムを別サーバーに持っていって動かしたところ、
ゴミデータが出力されました。
対応としては、プログラムを改修しましたが、
以前、スペース出力でずっと稼動していたプログラムが
別サーバーでは、ゴミデータ出力となる原因はなんでしょうか?
初期化を実施しない場合、ローカル変数は不定になることはわかりますが、
それだけでは、ずっとスペース出力されつづけていた理由が説明できない
ような気がしています。
ご存知の方、よろしくお願い致します。
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ランキング
-
Webアプリケーションの公開にあ...
-
ADボードのプログラムでの無限...
-
パイプで標準出力を隣のコマン...
-
VOB→RMについて
-
C++での検索と出力について
-
stdin,stdoutについて
-
動画ファイルのサイズ変更
-
Excel2007でのエクスポート
-
Access2003からピボットテーブ...
-
C言語にてテキストファイル内の...
-
EXCELのVBAでファイル出力する...
-
コマンドプロンプトとリダイレ...
-
VBA(EXCELマクロ)でHTMLを表示
-
外国語とCSVについて
-
プリンタに出力する信号をパソ...
-
printfでの出力を監視
-
パイソンでのVSコードで
-
C言語のフラグについてお願いが...
-
Turbo Delphi での、unicode 出...
-
拡張子.vsdをイラストレーター...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
【ExcelVBA】UTF-8(BOM無)でC...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
ファイルの文字コードをUTF-8に...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
BitBltについて。
-
Wordマクロで指定したフォルダ...
-
ファイル形式またはファイル拡...
-
CSV形式に変換
-
テキストファイルに改行コード...
-
C++ fprintf_sの使い方がわからん
-
外国語とCSVについて
-
1行ずつではなくまとめてファイ...
-
pcap形式データをテキストへ抽出
-
重複チェックプログラム
-
AviUtlでAVI出力が途中までしか...
-
CBool関数について VB6とVB.net...
-
標準出力とファイルに効率的に...
おすすめ情報