2016-06-28 9 views
1

structを最初に宣言せずに構造体を関数に渡すことについて質問があります。このような関数に構造体を渡す

static void DrawArc(struct MATH_POINT *p, other args); 

私はこの

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

のような構造体を渡すことができます知っている。しかし、私はまた、このようにそれを行うことができます:

は、私はこのような構造体のポインタをとる関数を持っている

DrawArc(&(struct MATH_POINT){0,0}, other args); 

私は非常に限定されたレジスタ空間を持つ組み込みプラットフォーム上で、私のGUIの楽しみ多くの引数が必要です。

しかし、私が心配しているのは、引数リストで初期化した構造体が、RAMを使いこなしてしまうことです。これは可能ですか?または、関数が終了するとすぐに構造体が破棄されますか?

ありがとうございます!

+1

この質問は、使用している特定のコンパイラおよびプロセッサを知らなくても回答できません。また、最適化を有効にしてビルドするかどうかも関係ありません。 –

+0

私はarm-none-eabiを使用しています。私は-O2を持っています。私はSTM32F767-144ピンを使用しています。 –

答えて

3

あなたはミックスしているものをマッチングしています。 malloc/calloc/etcで明示的にインスタンス化されていませんが、ローカルでインスタンス化されたオブジェクトはヒープメモリを取らず、変数がスコープを終了するまでスタックが大きくなるだけです。

あなたの最初の例:

struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

は完全に罰金です。 pointはスタックに割り当てられますが、それ自身を格納するのに必要なメモリより多くのメモリを必要とせず、宣言のスコープを終了すると自動的に解放されます。

どちらの場合でも、両方の例では、動的割り当てがないため、物事を残すリスクはありません。第二は、関数が戻るとすぐに破棄されながら、最初の1の範囲は、まだDrawArcを呼び出した後に生きているので、

+0

答えをありがとう!私は、2つのメソッドのコードサイズもテストすると思います。そして、私は最初の方法に固執し、将来の使用のためにポイント変数を周りに保つと思います。 –

-1
struct MATH_POINT point = {0,0}; 
DrawArc(&point, other args); 

この時点の変数は、この

DrawArc(&(struct MATH_POINT){0,0}, other args); 

よりも長生きします。 (そして:どちらも「固執しない」、どちらも明確なライフサイクルを持っています;-))

変数を「削除」し、追加のスコープを追加し、不要にする場合は閉じますこれ以上:

#define MANY 10000 
{ 
    struct MATH_POINT removeMe[MANY]; 
    /* work on removeMe while they're alive */ 
    doThings(removeMe, other_stuff); 
} 
/* here removeMe is gone, and the mem can/will be used otherwise */ 
+0

'となり、2番目の関数は関数が返るとすぐに破棄されます。 'いいえ、関数はスコープを導入したり終了したりしません。複合リテラルの有効期間は、現在のブロック(関数呼び出しがあるブロック)の閉じ括弧まで続きます。 – 2501

+0

erm ...そして、スコープから外れる関数パラメータ(この呼び出しのために一時的な場合)の正確な時刻はいつですか?関数が戻るとすぐに。私は新しいスコープが導入されたと言っていませんでしたか? – Tommylee2k

+0

私はあなたの引用に対して反対していますが、これは正しくありません。 – 2501

関連する問題