gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:08:15 25 4
gpt4 key购买 nike

我试图理解 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 的内存模型允许您轻松访问任何内容,因此您实际上可以执行上述操作并查看“有趣”的结果。

但是,您在这里所做的指定为 undefined behavior (UB) 由 C 标准。这意味着任何事情都可能发生;这可能是您所期望的,也可能不是。

请注意,您没有访问“局部变量”,因为在您进行访问时 func 已经返回,因此其局部变量的生命周期已经过期。您确实访问的是一个“恰好”具有有趣值的内存区域。如果您从 func 内部调用 func1,那么行为将是明确定义的。

一些注意事项:

Scope 绝对是一个编译时的概念;名称(变量、标识符等)的范围是编译器识别该名称的程序代码的子集。

这与变量的生命周期非常不同,后者在一般情况下独立于作用域,将两者混为一谈是一个常见的错误。局部变量的生命周期和范围确实是交织在一起的,但并非所有情况都是如此。

关于c - C 中的作用域是否仅与编译时相关,因为我们知道我们可以在运行时访问任何内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18612803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com