正しく初期化され、通話len中に安全ですか?set_array
void object_copy (Object* self, Object* obj) {
int len;
object_set_array (self, object_get_array (obj, &len), len);
}
そうでない場合、あなたは何をお勧めしますか?
いいえ-関数呼び出しへの引数の評価の定義された順序はありません。
toの呼び出しobject_get_array()は、toの呼び出しの前に発生する必要がobject_set_array()ありますが、コンパイラーが計算しobject_set_array()てlenパラメーターに対して渡す値は、コンパイラーが。の呼び出しを行う前に実行できますobject_get_array()。
呼び出しの2番目のパラメーターが何であるかobject_set_array()わかりません。コンマ演算子を使用したい場合があります。
void object_foo (Object* self, Object* obj) {
int len;
object_set_array (self, (object_get_array (obj, &len), len));
}
これはうまくいくでしょうが、混乱を招き、私はお勧めしません。
私はあなたが欲しいものは次のとおりだと思います:
void object_foo (Object* self, Object* obj) {
int len;
object_get_array (obj, &len); // get the length from obj
object_set_array (self, len)); // set the len for self
}
いいえ。2番目のパラメーター( )が評価さobject_set_array()れる前に、の3番目のパラメーターが評価されてスタックにプッシュされる場合があります。object_get_array()
おそらくあなたが欲しい
void object_copy (Object* self, Object* obj) {
int len;
/* I'm just guessing as to the return type */
Object *pObj = object_get_array(obj, &len);
object_set_array (self, pObj, len);
}
len初期化される前に、値をobject_set_array()呼び出しに渡します。ですから、それは間違っており、優れたコンパイラはそれについて警告します。変数にはランダムな値が含まれるため、コードはクラッシュしませんが、おそらく期待どおりの動作はしません。
object_get_array失敗した場合、初期化されlenない可能性があります。object_get_array呼び出す前に最初に呼び出す方がよいでしょうobject_set_array。そうすれば、呼び出しが機能したかどうかをテストできます。
object_get_arrayこれがサンプルコードです。何が返されるかわからないのでvoid *、説明を簡単にするためにを使用しました。
void * obj; obj = object_get_array(obj、&len); if(obj!= NULL)object_set_array(self、obj、len);
あなたが書いたコードは危険ですが、このようなショートカットに頼ると、失敗したと思うかもしれobject_set_arrayませんし、失敗したと思うかもしれませんobject_get_array。失敗するかどうかは自分で判断する必要があります。安全策を講じるためにコードが失敗すると常に想定しています。アプローチは異なります。特定のショートカットは問題ありませんが、これは問題ありません。
Cコードは左から右に実行されますが、式が評価される順序(コンパイラーとコンパイルされたコードによって異なります)で、関数が機能した場合ははい、len初期化されますが、安全ではありません。
これがお役に立てば幸いです、よろしく、トム。
これも機能します:
ARRAY object_get_array (Object* self, int* len);
void object_set_array (Object* self, ARRAY array, const int* len);
// ...
void object_copy (Object* self, Object* obj) {
int len;
object_set_array (self, object_get_array (obj, &len), &len);
}
への呼び出しobject_get_array()は常に への呼び出しの前に評価されobject_set_array()、その時点でlen正しい値が設定されるためです。