1

正しく初期化され、通話len中に安全ですか?set_array

void object_copy (Object* self, Object* obj) {
    int len;
    object_set_array (self, object_get_array (obj, &len), len);
}

そうでない場合、あなたは何をお勧めしますか?

4

5 に答える 5

6

いいえ-関数呼び出しへの引数の評価の定義された順序はありません。

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
}
于 2010-01-22T23:48:21.497 に答える
1

いいえ。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);
}
于 2010-01-22T23:48:20.903 に答える
0

len初期化される前に、値をobject_set_array()呼び出しに渡します。ですから、それは間違っており、優れたコンパイラはそれについて警告します。変数にはランダムな値が含まれるため、コードはクラッシュしませんが、おそらく期待どおりの動作はしません。

于 2010-01-22T23:47:54.040 に答える
0

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初期化されますが、安全ではありません。

これがお役に立てば幸いです、よろしく、トム。

于 2010-01-22T23:52:35.620 に答える
0

これも機能します:

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正しい値が設定されるためです。

于 2010-01-23T00:07:52.527 に答える