2010-06-22 144 views
1

如果一个块中定义了一个变量,它是仅存在于该块中还是存在于整个程序中? 例如c变量范围

main() 
{ 
    int j=5; 
    { 
     int i=10 
     printf("%d",i); 
    } 
    printf("%d , %d ",i,j); 
} 

是它有效

main() 
{ 
    int j=5, *k; 
    { 
     int i=10 
     printf("%d",i); 
    } 
    k=&i 
    printf("%d , %d ",*k,j); 
} 

作为变量从其声明的点保持在存储器中的点文函数退出?

+0

我想你会发现无论是上述片段的编译,这将给你答案之外。 – JeremyP 2010-06-22 08:27:18

回答

1

这只是块内访问,所以在您的示例中的第二printf()是非法的,将无法编译。

11

非全局变量的范围是有限的,以它在限定的块中。此外,对于自动变量,一旦块结束该变量的寿命就结束了。

考虑这个傻例如:

void doit() 
{ 
    int *ps; 
    int *pa; 

    { 
     static int s = 1; 
     int a = 2; 

     ps = &s; 
     pa = &a; 
    } 

    // cannot access a or s here because they are out of scope 
    // *ps is okay because s is static so it's lifetime is not over 
    // *pa is not okay because a's lifetime ends at the end of the block 
} 

你的第二个printf行不能编译,因为i不在范围内。

+0

+1,因为我喜欢你的措辞比@ sharptooth的答案更好;) – Eltariel 2010-06-22 06:48:32

0

这个问题还涉及到你关于局部作用域或自动变量的问题。 作用域可以被定义为定义这个变量的模块。

而一个模块可能是一个函数或文件。

所以你可以声明在一个文件中的自动变量 - 这意味着它可以通过每个函数在该文件被访问,或者换一种说法 - 其范围被定义为在这种情况下,该文件。

如果声明相同的变量作为汽车,但在一个函数中,那就意味着它只能在该函数内被访问 - 或者其范围被定义为在这种情况下的功能。

思考汽车作为模块(其中模块可以是一个函数或文件)中的“本地”的。

在上面的示例中,您已经通过添加大括号来定义范围,因此变量i的范围已本地化到大括号内,这就是为什么您在大括号之外访问受限的原因。

0

i的范围限制在声明的块内。你的情况是

{ 
    int i=10 
    printf("%d",i); 
} 

因此我无法访问此范围