我试图理解C中作用域的确切含义。我能理解的是,作用域仅限于编译时。例如,如果您从其他函数访问局部变量。这将导致编译时错误。另一方面,以下程序可以正常运行。这意味着C具有平坦的内存模型,并且可以在运行时访问任何内容。C书籍将范围与生存期和变量可见性相关联,我发现这很令人困惑。我认为所有这些术语仅在编译时才有意义。有人可以照亮它吗?
#include "stdio.h"
int *ptr;
int func(void)
{
/** abc is a local variable **/
int abc = 132;
ptr = &abc;
return 0;
}
int func1(void)
{
/** although scope of abc is over still I can change the value in the address of abc **/
*ptr = 200;
printf("the value of abc=%d\r\n",*ptr);
}
int main(void)
{
func();
func1();
return 0;
}
结果:值abc
= 200
用简单的话来说,范围是什么意思?它是在运行时还是在编译时进入画面的?如我们所见,我们可以在运行时访问任何内容。但是,如果我们不遵循规则,那么将会得到编译错误。例如,另一个函数中的局部变量引用。编译器将引发错误,指出“变量未定义...”。
我可以说以下有关变量的信息吗?
1) Scope attribute comes under compile time.
2) Lifetime attribute comes under run-time.
3) Visibility attribute comes under compile-time
是的,C的内存模型使您可以轻松访问任何内容,因此您实际上可以执行上述操作,并看到“有趣的”结果。
但是,您在此处所做的操作被C标准指定为未定义行为(UB)。这意味着几乎任何事情都可能发生;那也许是您所期望的,也可能不是。
请注意,您没有访问“局部变量”,因为到您进行访问时func
已经返回,因此其局部变量的生存期已到期。您所访问的是一个“发生了”的存储区域,它具有有趣的价值。如果func1
从内部调用,func
则行为将是明确定义的。
还有一些注意事项:
范围绝对是仅编译时的概念;名称的范围(变量,标识符等)是程序代码的子集,编译器可以识别该名称。
这与变量的生存期有很大不同,后者在一般情况下与作用域无关,并且将两者混为一谈是一个常见错误。局部变量的生命周期和范围确实是交织在一起的,但是并非所有事物都如此。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句