【发布时间】:2017-12-21 08:23:07
【问题描述】:
在函数内部重新分配函数参数是不好还是好的做法,或者可能是未定义的行为?
让我用一个例子解释一下我想做什么,这里是函数:
void
gkUpdateTransforms(GkNode *node /* other params */) {
GkNode *nodei;
if (!(nodei = node->chld))
return;
do {
/* do job */
nodei = nodei->next;
} while (nodei);
}
替代方案:
void
gkUpdateTransforms2(GkNode *node /* other params */) {
/* node parameter is only used here to get chld, not anywhere else */
if (!(node = node->chld))
return;
do {
/* do job */
node = node->next;
} while (node);
}
我检查了汇编输出,它看起来一样,我们不需要在第二个中声明变量。你可能会问,如果参数类型改变了,但第一个条件相同,因为它也需要更新。
编辑:参数是传值,我的目的不是编辑指针本身
EDIT2:递归函数呢?如果 gkUpdateTransforms2 是递归的会发生什么?我很困惑,因为函数会调用自己,但我认为在每次调用中,参数都会是不同的堆栈
【问题讨论】:
-
该参数是函数的本地参数。修改 its 值与修改任何本地值一样好或坏。如果您以某种方式使其具有不确定的值,则它只是 UB。
-
在函数内部修改函数的参数是完全可以的。这一点也不坏。
-
完全没问题。当然不是未定义的行为。
-
"如果你以某种方式让它取一个不确定的值,它只是 UB" 我不知道该怎么做?但根据 cmets 看来我在安全区域
-
在格式良好的程序中无法做到这一点。无论哪种方式,都要像对待任何局部变量一样对待它。你没有做坏事。
标签: c function c99 c89 function-parameter