是否len
正確初始化並在set_array
中安全呼叫?嵌套調用會導致C中的未初始化參數?
void object_copy (Object* self, Object* obj) {
int len;
object_set_array (self, object_get_array (obj, &len), len);
}
如果不是,您會推薦什麼?
是否len
正確初始化並在set_array
中安全呼叫?嵌套調用會導致C中的未初始化參數?
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()
之前發生,可以在編譯器使得呼叫object_get_array()
之前完成了編譯器計算並傳遞到object_set_array()
爲len
參數的值。
我不知道到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
}
在初始化之前,您將len
按值傳遞給object_set_array()
調用。所以這是錯誤的,一個好的編譯器會對此提出警告。該變量將包含一個隨機值,所以代碼不會崩潰,但它不會做你可能想要的。
否。在評估第二個參數(object_get_array()
)之前,可以評估第object_set_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);
}
@sth:是的,我知道我正在避開呼叫公約問題,謝謝。 – egrunin 2010-01-23 03:18:05
如果object_get_array
失敗,那麼len
可能不會被初始化。在致電object_set_array
之前,最好先打電話object_get_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
將被設置爲正確的值之前進行評估。
第二個也更可讀。 – GManNickG 2010-01-22 23:50:40