- 締切済み
C言語のローカル変数初期化について
ローカル変数の初期化を実施していない場合、 その変数をファイル出力するとゴミデータが出力されます。 これは仕様通りだと思います。 さて、初期化を実施していないにもかかわらず、 偶然ですが、ファイル出力時はスペース出力されていたプログラムがあります。 このプログラムを別サーバーに持っていって動かしたところ、 ゴミデータが出力されました。 対応としては、プログラムを改修しましたが、 以前、スペース出力でずっと稼動していたプログラムが 別サーバーでは、ゴミデータ出力となる原因はなんでしょうか? 初期化を実施しない場合、ローカル変数は不定になることはわかりますが、 それだけでは、ずっとスペース出力されつづけていた理由が説明できない ような気がしています。 ご存知の方、よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
関連するQ&A
- C言語で変数を初期化するにはどうすればよいでしょうか。
こんにちは。 C言語で、一度文字列を入力した変数(ポインタとか配列のことを含めてます)を再度初期化することは可能でしょうか。「初期化」という表現が合っているのか自信はないのですが、要は一度変数に入れた文字列を消去して、再利用する方法を探しています。 目標は、 1.ファイルに変数の文字列を出力する FILE *fp = fopen("file.txt","w") char *str = "text" fprintf(fp,"%s",str) ↓ 2.その変数は初期化し、初期化した変数にまた文字列を代入する *str = 初期化 *str = "text2"; ↓ 3.それをまたファイルに出力する(以下エンドレス) fprintf(fp,"%s",str) という流れにしたいのですが、2.の「初期化」がわからないので、文字列を代入すると、最初にいれた"text"のあとに"text2"がくっついてくる形になってしまい困っています。 これだとstrの容量が大きくなってしょうがないですし、ファイルに出力される文字列も重複したものになってしまうので、いったんstrに入っている文字列を消去してしまって、また新たにstrに文字列を入れようと思っているのですが可能でしょうか。 1~3の動作をほぼエンドレスでやりたいので、新たに変数を作るというやり方意外に何か良い方法があれば教えて頂けないでしょうか。どうぞ宜しくお願いします。
- ベストアンサー
- C・C++・C#
- C言語のローカル変数の使い方について質問です。
C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }
- 締切済み
- C・C++・C#
- C,C++に変数の初期化と処理系について
C,C++で変数宣言したけれども初期化しないで使った場合、何らかの値を出力してしまう場合とかエラー(core dumpなども)を出して停止する場合など処理系依存ということになると思います。また、別言語ではデフォルトでゼロ指定される場合もあります。これは自動初期化とい意味で初期化がされているものに分類されます。 処理系で初期化しないで変数を利用して適当な値を出すという風になっているとしたらその理由とかメリットというのがあるものでしょうか。core dumpで処理が停止するというのは当然であり、良心的とも言えるわけで、適当な値を出すことは危険極まりないと思うのですが。 Windowsで、分子・分母の変数を定義しないで割り算したところ、256な数値が出ました。 Linuxではcore dumpになるところだと思います。 初期化して使え、ということを徹底するべきですが、逆に初期化しないでも(すなわち変数としてどのアドレスに対応しているか不明であっても?)計算を進めてしまうメリットがどこかにあるのか?という疑問が生じます。 いかがでしょうか。そこが分かれば尚更変数を初期化して使う習慣が身に着くと思うわけですが。
- 締切済み
- C・C++・C#
- 【シェルスクリプト】 ローカル変数、グローバル変数
シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
- main関数内のローカル変数について。
main関数内でローカル変数は使用しない方が良いのでしょうか? 例えばmain関数内でループ処理(無限ループ)を行なう場合、 プログラムを終了するまで、ローカル変数は解放されないように思います。 なので、プログラム実行中は常にスタックに積んである状態になってしまいます。 この場合main関数内の変数は静的変数にするのが望ましいのですか?? よろしくお願いします。
- 締切済み
- C・C++・C#
- 未初期化変数の扱い方についての質問
Microsoft Visual C++ 2008を使用しています。 #include <stdio.h> int main() { float a; … for(;;) { … scanf("%f",&a); … printf("%f",a); } } このようなプログラムを書いて、実行しました。 aという変数に数字を入力すれば問題ないのですが、誤って文字を入力してしまうと、-107374176という値が連続で出力されます。(for文のループが無限に繰り返される。) for文ではあるキーワードを入力するとループから出るというプログラムになっています。 間違って文字を入力する時にどの文字を入れても必ず、-107374176の値になるので調べたら、「-107374176は0xccccccccでvcのデバッグビルド時の未初期化変数の値と一致する。」という内容をネットで見つけました。 変数として定義されていて、初期化されていない変数を未初期化変数ということなので、aが未初期化変数になるのはわかるのですが、なぜループが無限につづくのかが理解できません。 質問の回答をよろしくお願いします。
- 締切済み
- C・C++・C#
- C言語
(a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?
- 締切済み
- C・C++・C#
- PHP 変数の初期化について教えてください
PHPを勉強中の者です。他のプログラム言語の使用経験は一切ありません。 PHPにおいては変数の初期化は絶対に必要ではないということで、今まで特に気にすることは無かったのですが、マニュアルにもあるように初期化することは良い習慣とのことで正しい初期化を知りたく質問させていただきます。 他のプログラムにおいては最も最初に解決すべき部分であり、恥を晒すようですが、なにとぞアドバイスをいただけたらと思います。 以下質問になります。 ---------------------------------- 1.私の解釈では変数の初期化とは、変数の型を決め初期値を入れる、と認識していますが、これは正しいのでしょうか。 2.Javaの参考書で変数の部分を読んでみたところ、型を決めただけでは初期化とはいわず、型決めと初期値を入れた工程(工程ってのもおおげさかもしれませんが)が初期化と記載がありました。 PHPにおいては型の宣言は不要とのことで下記のように記載すれば型及び初期値が決まると解釈していますが、この解釈は正しいのでしょうか? $a = 1; //これは整数 $d = 1.1 //これは浮動小数点 $b = "aa"; //これは文字列 $c = true; //これは論理値 $a = array(); //これは配列 3.他の参考になりそうなサイトで配列を代入する変数を初期化する場合として下記のような記載がありました。 unset($a); $a = array("aa", "bb"); unsetは変数を解放するためのものであり、私だったらこの場合の初期化として $a = array(); を書く方が適しているように思いますが、配列を代入する変数を初期化する場合、上記サンプルと私の考えとどちらが正しいのでしょうか? 4.変数を初期化するタイミングについて 質問のために、サンプルコードを書きました。まず下記サンプルを見てください。 ※このサンプルコードはformエリアからの入力値によって計算を行なうものと想定して下さい。値を受けた後の処理工程を記載しています。また、受ける値の正当性チェックについて省いています。 (1)(2)については質問箇所です。 (1) if(isset($_GET['send'], $_GET['int1'], $_GET['int2'])){ (2) $a = $_GET['int1']; $b = $_GET['int2'] }else{ exit; } $c = $a + $b; echo $c; サンプルコードは以上となります。仮にこういうコードがあったとして、初期化するタイミングがわかりません。コード中に(1)(2)と番号を振りましたが、個人的にこの2箇所のどちらかで初期化すればよいだろうと思い込んでいますが、こういうコードの場合、どの部分で初期化した方がいいのでしょうか? ---------------------------------- 質問は以上となります。 何卒宜しくおねがいします。
- ベストアンサー
- PHP
- Delphiの定数とローカル変数の初期化
Embarcadero RAD Studio 2010 Architect Trialというお試し版を使っています。 constを使って定義した定数をローカル変数の初期化の際に以下のようになります。 [DCC エラー] Test.pas(39): E2026 定数式が必要です これでは、定数を1箇所で定義しても定数が使えず即値なので、 プログラム作成やメンテナンスに困ると思うのですが、 昔、Delphiを使っていたのですが忘れてしまって、どうしていたか思い出せませんでした。 皆さんは定数をどのように定義して、どのように使っているのでしょうか? //■定義 unit DEFUnit; interface // 定数・変数 const DAT1 :Integer = 10; const DAT2 :Integer = 20; const DAT3 :Integer = 30; implementation // なし end. //■利用 unit TestUnit; interface uses DEFUnit; var data : Array [0..2, 0..1] of Integer = ( // 先手駒 (DAT1, 1), (DAT2, 2), (DA3T, 3) ); implementation end.
- ベストアンサー
- その他(プログラミング・開発)
- 変数の宣言、初期化
C++を習い始めたばかりの初心者です。下のプログラムを教えてください。 2つの整数値をキーボードから入力し、それをint型変数xとyに格納する。 一方double型変数aとbをそれぞれ5.3と2.5で初期化する。 このときa*x+b*yを算出し出力するプログラムを作成せよ。 本当に始めたばかりなので見当違いなことを書いてるかもしれませんが 自分でやってみるとこんなふうになりました。 #include <iostream> using namespace std; int main() { int x,y; cin>>x>>y; ←キーボードで入力する。 int a(5.3); ←初期化 int b(2.5); x=double(a); ←キャスト y=double(b); cout<<a*x+b*y<<endl; return 0; } お願いします。
- ベストアンサー
- C・C++・C#