2016-12-26 13 views
0

私はプロトタイプがint foo(int device, double *x, double *y) だった関数を呼び出していました。そして、私はこれをfoo(dev, (double*)x, (double*)y);のように呼びました。ここでxとyは両方とも浮動小数点へのポインタです。値渡しの変数の値を変更できますか? (In C)

何らかの理由で、デバイスが関数1に入っていて、ランダムな巨大値として出ていました。

fooはダブルスを扱っていて、私は浮動小数点数を渡したので、それは彼らの記憶を乱しましたか?

+0

あなたは 'x'と' y'のポインタを取得していません。それらをポインタにキャストしています。 –

+5

あなたがしたことは、xとyが浮動小数点を指していることをコンパイラに伝えていました。これは事実上嘘でした。したがって、C言語標準では、プログラムに「未定義の動作」があると言われます。それは何かをする責任があります。 – Gene

+0

コンパイラの警告を無音にすると、... –

答えて

1

何らかの理由で、デバイスが関数1に入っていて、ランダムな巨大値として出ていました。

は、それより悪い可能性があります。

あなたはバイト、たとえば、の要素へのポインタを渡したシステムに語った - しかし、これらの要素は、サイズだけバイトでした。

したがって、呼び出された関数は、ポインタを受け取った要素の1つに書き込むと、実際には2つの要素(使用可能な場合)を上書きしました。そして、値を受け取るために利用可能な要素がない場合...

この種のものは "未定義の動作"をもたらします。文字通り何かが起こる可能性があります(まれにも、プログラムは動作します。それはうまくいっています!

私はあなたがスタック上に一時的な変数DEVとXの両方が割り当てられていたと思われる。その時点で

float x[2]; 
int dev; 

を、xのアドレスも住んDEV呼び出し側のスタック、内側を向きました。呼び出しプロトタイプの不一致により、dev が上書きされ、他の人はを知っています。 devをパラメータとして渡していなくても、同じものがすべて同じに上書きされます

+0

それだった、ありがとう!私はあなたが本当にあなたがすることに注意する必要がCで推測する。 – Pedro

+0

Cだけではありません:-)しかし、そうです。私はいつも*すべての警告を有効にしておき、同じことをするようアドバイスします。また、 'valgrind'ユーティリティは見つけにくいメモリエラーをデバッグするのに便利です。 – LSerni