2012-02-23 8 views
1

申し訳ありませんこれは少しの初心者質問ですが、私はCの方がかなり新しいです。私はGCCコンパイラを使用しています。文字列を含むプログラムを書くと、文字列が一定の長さを超えていれば、いくつかの内容から始まるように見えます。私はそれが別のプログラムで使用されている可能性があるので、それを上書きすることを心配しています。問題を示すサンプルコードは次のとおりです。Cの文字列の開始状態

#include <stdio.h> 
// Using the GCC Compiler 
// Why is there already something in MyString? 
int main(void) { 
    char MyString[250]; 

    printf("%s", MyString); 
    getch(); 
    return 0; 
} 

この問題を回避するにはどうすればよいですか?ご協力いただきありがとうございます。

+0

これまでにメモリに格納されていたのはまさにその時です。上書きするのはまったく問題ありません。実際に必要なのは、そのメモリの内容が何であるかわからないからです。 – jcoder

+0

main()はintを返す必要があります。 (あなたのプログラムは 'int main(void)'として定義されていますが、int値のゼロを返します)。プログラムはコンパイルすべきではありません。 MyString []は初期化されていません。 – wildplasser

答えて

5

MyStringには何かがあるのはなぜですか?

myStringは初期化されておらず、何かを含むことができます。

char MyString[250] = { 0 }; 

または彼の答えにunwindで指摘したように:

char MyString[250] = ""; 

より読みやすく(および以下と一致)である空の文字列に初期化するために

。文字列に初期化するために

char myString[250] = "some-string"; 

私はあなたのプログラムの実行中の各インスタンスは、そのを持っています別のプログラム

によって使用されていることができたとしてそれをoverwritting心配own myString

+1

初期化されていない場合は、以前にメモリ内にあったものがすべて含まれています。上書きすると問題ありません。あなたはそれをとにかく上書きしようとしているので、なぜ時間とプログラムコードがあなたのためにそれをクリアするのでしょうか?考えます。 – jcoder

+0

すぐに応答していただきありがとうございます。これは安全なルートですか?メモリの一部は、他のプログラムが何かをそこに置いていたとしても、もはや使用されていませんか? – user1228123

+0

@ user1228123他のプログラムには何も置かれていません。初期化されていません。 – hmjd

2

問題は、文字列が初期化されていないことです。

A C-文字列は '\ 0' で終わるで終わるので、あなたは、単にあなたの宣言の後ろ

MyString[0] = '\0'; 

のようなものを置く必要があります。このようにして、printfのような関数が期待どおりに動作することを確認します。この配列を文字列として使用されることが意図されているので多くは、しかし

char myString[50] = { 0 }; 

の配列形式の初期化を推奨しているいくつかの理由

+0

おかげでティム、これと{0}ルートを試してみます – user1228123

0
char MyString[250] = {0}; 

が、良い使用する

std::string 
+1

'std :: string'はCの構文エラーです。たぶんCとC++を混同していますか? – wildplasser

+0

@wildplasser、orginallyは削除されたC++タグを持っていました。 – hmjd

+0

私は見ます..私はコメントを削除します。 BTWは、C++でvoid関数から0を返すのは有効ですか? – wildplasser

2

文字列イニシャライザを使用するとはるかにわかりやすく、よりシンプルな構文になります。

char myString[50] = ""; 

これはまったく同じことですが、配列を初期化しようとしているものが実際には空の文字列であることがはっきりしています。

"ランダムな"データが表示されている状況は、配列に何が起こっているかということです。初期化していないため、そこに何が起こったのかを単に取得するだけです。これはではありません。は、他のプログラムによって同時にメモリが使用されていることを意味しますので、心配する必要はありません。 は、charの配列へのポインタを渡すことを心配する必要がありますが、文字列を期待するC関数に対しては適切に0で終了しません。

技術的には、未定義の動作を呼び出すことがあります。これは避けるべきことです。メモリにどのくらい離れているのか分かりませんので、簡単にプログラムをクラッシュさせることができます。オペレーティングシステムは、アクセスできないメモリにアクセスしようとするプロセスを自由に削除することができます。

アレイを空の文字列に適切に初期化することで、この問題を回避できます。

+0

+1何が起きているのかがはっきりしています。 – hmjd

0

char配列を任意の値に初期化したので、いくらかのガベージ値が含まれます。

char MyString [250] = "My Array";次のようなものを使用するのは良いプログラミング方法です。 //使用する配列がわかっている場合

char MyString [250] = '\ 0'; //初期化中にchar配列のデータを埋めるつもりがない場合