我试图理解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;
}
Run Code Online (Sandbox Code Playgroud)
结果:值abc= 200
用简单的话来说,范围是什么意思?它是在运行时还是编译时出现的?我们可以看到,我们可以在运行时访问任何内容.但是,如果我们不遵守规则,那么我们将得到编译错误.例如,另一个函数中的局部变量引用.编译器将抛出一个错误,说"变量未定义......".
我可以对变量说以下内容吗?
1) Scope attribute comes under compile time.
2) Lifetime attribute comes under run-time.
3) Visibility attribute comes under compile-time
Run Code Online (Sandbox Code Playgroud)
是的,C的内存模型允许您轻松访问任何内容,因此您可以实际执行上述操作并查看"有趣"的结果.
但是,您在此处执行的操作由C标准指定为未定义行为(UB).这意味着任何事情都可能发生; 这可能是你所期望的,也可能不是.
请注意,您没有访问"局部变量",因为当您访问func已经返回时,因此其局部变量的生命周期已过期.你是什么做访问是存储区域说,"刚好"有一个有趣的价值.如果你func1从内部打电话,func那么行为就会很明确.
还有一些说明:
范围绝对是一个仅编译时的概念; 名称的范围(变量,标识符等)是程序代码的子集,其中该名称由编译器识别.
这与变量的生命周期非常不同,变量的寿命与一般情况下的范围无关,并且将两者混为一谈是常见的错误.局部变量的生命周期和范围确实是交织在一起的,但事实并非如此.