C中函数参数的范围

时间:2017-03-24 11:47:04

标签: c scope

C中的以下代码是否正确?我不是100%确定函数参数“a”的范围:

void method(int a)  
{  
  MyStruct mystruct;
  mystruct.value = (void*) (&a);

  nested_method_call(mystruct);
 }

3 个答案:

答案 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而不是Scopea的生命周期将持续到函数method的结尾。因此,假设a的类型为nested_method_call,仍可通过指针struct.valuestruct.value内访问int*