2010-06-22 200 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); 
} 

因此我無法訪問此範圍