C中的以下代码是否正确?我不是100%确定函数参数“a”的范围:
void method(int a)
{
MyStruct mystruct;
mystruct.value = (void*) (&a);
nested_method_call(mystruct);
}
答案 0 :(得分:1)
首先,struct
是C中的关键字,不能用作变量名,因此这是错误的代码。
之后,将整数转换为指针(反之亦然)是实现定义的行为。如果你必须完成转换,最好更好地使用uintptr_t
。
那就是说,从你问题的基本前提来看,代码背后的逻辑似乎是合法的,范围没有问题。如果您打算询问生命周期[“对象的生命周期是程序执行期间存储的部分
保证为它保留“],然后,直到method()
函数结束并且你在该限制内使用它,所以你很高兴。
答案 1 :(得分:1)
我们假设它是:
void method(int a)
{
MyStruct x;
struct.value = (void*) a;
nested_method_call(x);
}
因为struct
不能用作变量名。
a
的范围是函数,因此它在nested_method_call
期间仍处于活动状态,但是,这绝对不相关,因为您的nested_method_call
并未引用它 - 它正在使用将a
的副本重新解释为void*
。 (顺便说一句,这样的重新解释使得代码非常不可移植和不寻常。这可能是一个错误。)
修改强>
void method(int a)
{
MyStruct mystruct;
struct.value = (void*) &a;
nested_method_call(mystruct);
}
是有效的(尽管通过指针传递结构通常是一个好主意,因为它对于任何非常小的结构都更快)。在&a
的{{1}}之前,}
是有效的引用。
你也不应该需要那个演员。如果method
为.value
,则表示您不需要它。如果不是,则强制转换使void*
可转换为任何其他数据指针,这可能是类型系统中的一个危险漏洞。
答案 2 :(得分:0)
更正后的代码:struct.value = (void*)&a;
。还需要进行一些其他验证。
因此,如果您完全更正了代码以使其符合规定,那么正确的字词将是Lifetime
而不是Scope
。 a
的生命周期将持续到函数method
的结尾。因此,假设a
的类型为nested_method_call
,仍可通过指针struct.value
在struct.value
内访问int*
。