2015-02-24 46 views
0

我正在學習內存在C中的建模方式。我知道基本上有四個不同的部分。靜態存儲器,堆棧,堆和程序存儲器。我知道當某些東西被聲明爲靜態時,它的生命週期(不一定是它的可見性)就是整個程序。所以我們可以說我已經寫了這樣的事情:這兩個變量在內存中的處理方式有什麼不同

#include <stdio.h> 
void add(); 

main(){ 
    int i; 
    for (i=0; i<6;++i){ 
     add();  
    } 
    return 0; 
} 

void add(){ 
    static int x=5; 
    x++; 
    printf("The value of x is %d\n", x); 
} 

程序跟蹤x到最後執行的價值。如果我寫這樣的程序,我得到幾乎相同的結果:

#include <stdio.h> 

int x=5; 

add(int *num){ 
    (*num)++; 
    printf("The value of x is %d\n", *num); 
} 

main(){ 
    int i; 
    for (i=0; i<6;++i){ 
     add(&x); 
    } 
    return 0; 
} 

我沒有使用static關鍵字,但由於其解決困難,程序跟蹤其價值的的連續執行add()功能。我想知道在這兩種情況下,x在內存中處理的方式是相同的。第二個x也被視爲靜態?

+0

可能的重複[什麼是「靜態」在C程序中的意思?](http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program) – 2015-02-24 02:56:22

+0

是的,它是。全局變量和靜態局部變量之間的唯一區別就是範圍。 – Mints97 2015-02-24 02:57:12

+0

那麼爲什麼有人仍然在主函數之外寫入'static int x = 5'?如果它已經是靜態的,它不會是多餘的嗎?我相信我看到過類似的東西。 – 2015-02-24 03:00:24

回答

3

第二個x也被視爲靜態?

沒有第二個x不被視爲Static。您仍然可以創建第二個變量Static,這會導致不同的結果。如果第二個x被聲明爲static「範圍將被限制爲文件」,但在您的情況下,它是而不是僅限於文件。

而且是在這兩種情況下x生活在程序的生命週期,但注意,使用大括號,限制範圍,

在第二種情況下x只限於功能add()

void add(){ // <= From here 

    static int x=5; 
    x++; 
    printf("The value of x is %d\n", x); 

} // <= to here 
範圍

而對於第二種情況,x是全球性的,也可以從其他文件訪問。

相關問題