2011-09-23 20 views
1

MicrosoftがVS2010で再び逆火しているようです。ここに私のコードVisual Studio 2010のランタイムチェックに失敗しました。#3

#include "string.h" 
typedef struct s_test 
{ 
    unsigned char a[20]; 
} t_test, *p_test; 
void initialize(t_test t) 
{ 
    memset(t.a, 0, 20); 
} 
void main() 
{ 
    t_test t; 
    initialize(t); 
} 

だし、まあ

Run-Time Check Failure #3 - The variable 't' is being used without being initialized. 

をスローします...他のケースでは、ランタイム・チェッカーは、私が溶液中でそれをオフにしにくいんだそう助けないから。しかし、どうしたらいいですか?引数をポインタに渡す方法を変更することをお勧めします。しかし、一貫したコーディングスタイルに関しては不愉快な経験になるでしょう。今、私はこの素敵なもののためにMSにrawringのように感じます; p

+1

コードはコンパイルされません。 't_test'にメンバ' a'がありません – JaredPar

+0

Jaredの修正が行われました。 –

答えて

2

まあ、あなたが得ているエラーレポートは、完全に有効で適切なエラーレポートです。これはまさにあなたがやっていることです:あなたは初期化されていない値を使用しています。初期化されていないオブジェクトをコピーしようとしています。その場合は、もちろん、時間軸チェッカーのレポートが必要です。

基本的には、どのようなあなたのコードでやっていることは非常に同じ理由で同じエラーがトリガされます。この

int a, b = a; 

このコードと同等です。それで、なぜあなたはそれについて不平を言っていますか?

+0

私はちょうど執拗に感じています。あなたの例では、値のbの変更はaと同じではありません。だから、まだその評価の後には初期化されていない。私はそれが違いだと思う。 –

+0

@ Y.Z:あなたが指摘していることは分かりません。あなたのコードでは、 'initialize '内のローカル' t'への変更は、 'main'から渡された' t'を変更しません。したがって、 'initialize'の後、' main'の 't'はまだ初期化されていません。これは私の例とまったく同じです。違いはどこで分かりますか? – AnT

2

これは、値を渡している、つまりユニット化された値だからです。以下のように、それは実際にオブジェクトに渡され、すべてがうまくているを変更することができるように、あなたの初期化関数を定義します。

void initialize(t_test *pt) 
{ 
    memset(pt->x, 0, 20); // x not a 
} 

また、すべてのことは神聖だ、変更のために:

void main() 

+1

正しいですが、Cには参照のみがあり、ポインタのみです。 'void initialize(t_test * t)'として宣言し、 'initialize(&t)'としてそれを渡す必要があります。 –

+0

@Adam、著者がCプログラムについて質問したことを指摘してくれてありがとう。私は質問がC、C++についてではなかったという事実を反映するように答えを修正しました。 –

+0

だから、ローカル変数がまだそのスコープに入っていても、main()のローカル変数をそのサブ関数initialize()で初期化することは想定されていません。それはちょっと変だ。 –

関連する問題