我们知道我们可以在运行时访问任何内存,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;
}

结果:值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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们如何在运行时更新OSGI中的任何捆绑软件

来自分类Dev

我们如何在运行时更新OSGI中的任何捆绑软件

来自分类Dev

C ++是静态类型语言,为什么我们可以在运行时获取类型

来自分类Dev

我们可以在运行时在 C# 中为运行时创建的控件创建多个事件吗

来自分类Dev

我们可以在运行时知道代码是在浏览器中还是在服务器上运行吗?

来自分类Dev

为什么我们在OpenGL 2中在运行时编译着色器?

来自分类Dev

我们可以在运行时为表单加载dfm文件吗?

来自分类Dev

我们可以在运行时检查动态数组的大小吗

来自分类Dev

如何在运行时识别我们是否正在从Amazon下载的apk上运行

来自分类Dev

如何在运行时识别我们是否正在从Amazon下载的apk上运行

来自分类Dev

仅当Charles代理已启动并正在运行时,我们的应用程序才会加载GUI

来自分类Dev

iOS-我们可以在运行时将矢量pdf转换为png吗?

来自分类Dev

我们能否在运行时确定两个type_info是否可转换?

来自分类Dev

当我们在运行时增加分区时,Kafka如何保证消息顺序?

来自分类Dev

我们可以让Selenium WebDriver等待用户在运行时单击网页链接时不使用隐式等待吗?

来自分类Dev

为什么我们在Clojure的运行时看到Arity相关的异常?

来自分类Dev

为什么我们在Clojure的运行时看到Arity相关的异常?

来自分类Dev

我们有什么方法可以知道量角器脚本当前是否正在运行

来自分类Dev

当我们使用 group by 时是否可以访问组中的行

来自分类Dev

我们可以在android M服务中使用需要运行时权限的功能吗?

来自分类Dev

我们可以访问已释放的内存吗?

来自分类Dev

将多态性浪费在申请我们在运行时确切知道类型的类时会浪费吗?

来自分类Dev

C中的sizeof mmap,我们如何知道我分配了多少内存

来自分类Dev

V8是否仅编译我们要运行的代码?

来自分类Dev

我们可以在运行时在每个信封上自定义DocuSign响应电子邮件Blurb(内容)吗?

来自分类Dev

为什么我们需要在运行时实例化一个类型?

来自分类Dev

我们如何在运行时写不同的字母/如何统一编写动画?

来自分类Dev

我们可以清除 Ubuntu 中的内存缓存吗

来自分类Dev

如果我们使用小文件,HDFS中是否有任何内存丢失?

Related 相关文章

  1. 1

    我们如何在运行时更新OSGI中的任何捆绑软件

  2. 2

    我们如何在运行时更新OSGI中的任何捆绑软件

  3. 3

    C ++是静态类型语言,为什么我们可以在运行时获取类型

  4. 4

    我们可以在运行时在 C# 中为运行时创建的控件创建多个事件吗

  5. 5

    我们可以在运行时知道代码是在浏览器中还是在服务器上运行吗?

  6. 6

    为什么我们在OpenGL 2中在运行时编译着色器?

  7. 7

    我们可以在运行时为表单加载dfm文件吗?

  8. 8

    我们可以在运行时检查动态数组的大小吗

  9. 9

    如何在运行时识别我们是否正在从Amazon下载的apk上运行

  10. 10

    如何在运行时识别我们是否正在从Amazon下载的apk上运行

  11. 11

    仅当Charles代理已启动并正在运行时,我们的应用程序才会加载GUI

  12. 12

    iOS-我们可以在运行时将矢量pdf转换为png吗?

  13. 13

    我们能否在运行时确定两个type_info是否可转换?

  14. 14

    当我们在运行时增加分区时,Kafka如何保证消息顺序?

  15. 15

    我们可以让Selenium WebDriver等待用户在运行时单击网页链接时不使用隐式等待吗?

  16. 16

    为什么我们在Clojure的运行时看到Arity相关的异常?

  17. 17

    为什么我们在Clojure的运行时看到Arity相关的异常?

  18. 18

    我们有什么方法可以知道量角器脚本当前是否正在运行

  19. 19

    当我们使用 group by 时是否可以访问组中的行

  20. 20

    我们可以在android M服务中使用需要运行时权限的功能吗?

  21. 21

    我们可以访问已释放的内存吗?

  22. 22

    将多态性浪费在申请我们在运行时确切知道类型的类时会浪费吗?

  23. 23

    C中的sizeof mmap,我们如何知道我分配了多少内存

  24. 24

    V8是否仅编译我们要运行的代码?

  25. 25

    我们可以在运行时在每个信封上自定义DocuSign响应电子邮件Blurb(内容)吗?

  26. 26

    为什么我们需要在运行时实例化一个类型?

  27. 27

    我们如何在运行时写不同的字母/如何统一编写动画?

  28. 28

    我们可以清除 Ubuntu 中的内存缓存吗

  29. 29

    如果我们使用小文件,HDFS中是否有任何内存丢失?

热门标签

归档