len正确初始化和安全的set_array电话?

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_set_array()len参数可以编译器之前进行使调用object_get_array()

我不知道该怎么对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
}

其他提示

没有。 object_set_array()的第三个参数可能被评估和被评估的第二个参数(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);
}

您由值传递lenobject_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将已被设置为正确的值之前进行评价。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top