2010-11-28 3 views
0

私はまだC言語のノブです。私はそれを定期的に使用しますが、一般的にCのポインタ機能は使用しません。は、関数内のローカル空間にすでに存在する構造体へのポインタを渡します。C言語のポインタとローカル変数をポインタとして渡す方法

struct WorldCamera p_viewer; 
struct Point3D_LLA p_subj; 
struct Point2D_CalcRes p_res; 
p_viewer.hfov = 25; 
p_viewer.vfov = 25; 
p_viewer.p.lat = 10.0f; 
p_viewer.p.lon = 10.0f; 
p_viewer.p.alt = 100.0f; 
p_subj.lat = 9.98f; 
p_subj.lon = 10.0f; 
p_subj.alt = 100.0f; 
// Do something interesting here. 
compute_3d_transform(&p_viewer, &p_subj, &p_res, 10000.0f); 
// Do something interesting here. 

compute_3d_transformのプロトタイプはこれです:

void compute_3d_transform(struct WorldCamera *p_viewer, struct Point3D_LLA *p_subj, struct Point2D_CalcRes *res, float cliph); 

私はこの権利を持っているかどうかを知りたい私はこのコードを持っています。私は多くのメモリ保護を持っていないと思う小さなマイクロコントローラでプログラミングしています。 1つのメモリを破壊すると、将来デバッグが困難な奇妙なバグが発生する可能性があります。私はこれらが専用のヒープを必要とするので、malloc/calloc関数の使用を避けようとしています。

+0

あなたは私にそれを得たように見えます。 – sizzzzlerz

答えて

5

オペレーター&のアドレスを使用してください。

ああ、あなたは正しいです。

あなたが正しいのは、&p_viewerがのstruct WorldCameraという変数(たとえば、ローカル変数)を指すポインタであるためです。 compute_3d_transformは、struct WorldCameraへのポインタを必要とするので、呼び出し元としての意図は、呼び出し先の意図と一致します。もちろん

、(のみ、プログラムを読み込む compute_3d_transform、あるいは少なくともそのドキュメントを含めることによって収集することができる)全体の意図を見ることなく、論理エラーが、型が一致しているという事実は、すでにのがあるかもしれません私はあなたの compute_3d_transform機能を推測している

1

大きな慰め(タイプがあった場合の意図はそれほど明確ではないので、もちろん、void *代わりに、より多くの頭痛の種があるが)p_resにその結果を書き込みます - それはそれがないすべてだ場合、あなたのコードは問題ありません。

変数がスコープから外れた後に使用される可能性があるように、ローカル変数へのポインタを格納しないようにしてください。

+0

正しいですが、結果はp_resに書き込まれます。 –

0

コードは正しく、メモリの破損は考えられません。

頭に浮かべるのは、ポインタを渡す関数の副作用です。特に、割り当てられたデータをスタックするためのポインタでは、データを含む関数から戻ると、そのポインタは無効とみなされます。

あなたの指針で何が起こっているのかを知ることがすべてです。 compute_3d_transform関数は、ビューアとサブジェクトのパラメータを入力として使用し、結果パラメータが指す領域を塗りつぶします。ポインタは格納されないので、後で使用される可能性がありますので、compute_3d_transformの完了後に副作用はありません。 (入力としてのみ使用されるポインタパラメータは通常、その機能の目的のためにターゲット領域を定数としてマークするためにconstとマークされます)。

関連する問題