C中的作用域仅与编译时间相关,因为我们知道我们可以在运行时访问任何内存吗?

dex*_*ous 7 c

我试图理解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)

Jon*_*Jon 8

是的,C的内存模型允许您轻松访问任何内容,因此您可以实际执行上述操作并查看"有趣"的结果.

但是,您在此处执行的操作由C标准指定为未定义行为(UB).这意味着任何事情都可能发生; 这可能是你所期望的,也可能不是.

请注意,您没有访问"局部变量",因为当您访问func已经返回时,因此其局部变量的生命周期已过期.你是什么访问是存储区域说,"刚好"有一个有趣的价值.如果你func1从内部打电话,func那么行为就会很明确.

还有一些说明:

范围绝对是一个仅编译时的概念; 名称的范围(变量,标识符等)是程序代码的子集,其中该名称由编译器识别.

这与变量的生命周期非常不同,变量的寿命与一般情况下的范围无关,并且将两者混为一谈是常见的错误.局部变量的生命周期和范围确实是交织在一起的,但事实并非如此.