2011-10-07 85 views
2

我正在玩静态关键字。在下面的代码中,我无法弄清楚为什么x在状态和增量之前保存它。 我期待打印1树时间。据我所知,如果我将x声明为静态,则应该发生这样的行为。变量保持其状态,即使未声明为静态

void print_it(void); 

    int main (int argc, const char * argv[]) 
    { 
     print_it(); 
     print_it(); 
     print_it(); 
     exit(EXIT_SUCCESS); 
    } 

    void print_it(void) 
    { 
     int x; 
     printf("%d\n", x++); 
    } 

回答

7

您尚未将x初始化为任何值。因此,x中的初始值将会是垃圾,因为它每次都会自增,因为它可能每次都使用相同的内存位置。

试着改变你的代码如下:

void print_it(void); 
int main (int argc, const char * argv[]) 
{ 
    print_it(); 
    print_it(); 
    print_it(); 
    exit(EXIT_SUCCESS); 
} 

void print_it(void) 
{ 
    int x = 0; 
    printf("%d\n", x++); 
} 
+0

我想他留下了一个静态的声明和x的初始化,并且他想要是指在他的'print_it'功能X,太行'INT x = 0;'应该完全移除,x应该是全局的。 – Paulpro

+0

“,因为它可能每次都使用相同的内存位置。”完全正确,变量在堆栈上,并且因为没有干预代码来擦除它,所以它保持不变。 –

+0

谢谢Aamir!这是我正在寻找的。 – jingo

0

未初始化的局部变量的初始值是不确定的。在这种情况下,该值只是坐在堆栈上并被重用,因为您连续三次调用同一个函数。如果您调用其他具有局部变量的函数,则该值将改变,因为其他函数将使用相同的堆栈内存。

0

没有人,你错了。变量不能保持其价值。你没有初始化int x,所以每次都有garbase值 &你正在增加打印,增加了garbase值的&。

你变得一样,但标准说它可能不一样。

在一百万次你得到相同的值仍然不能接受局部变量保持其值。

不同的系统与不同的环境可能你的程序有不同的价值..!

编辑: 在大多数情况下,局部变量的值为0.所以它不保留其以前的值。

void print_it(void); 

int main (int argc, const char * argv[]) 
{ 
    print_it(); 
    print_it(); 
    print_it(); 
    return 1; 
} 

void print_it(void) 
{ 
    int x; 
    printf("starting %d\n", x); 
    x++; 
    printf("after increment %d\n", x); 
} 

如果变量保持其状态,那么它的输出应该是

starting 0 
after increment 1 
starting 1 
after increment 2 
starting 2 
after increment 3 

但其真正的输出

starting 0 
after increment 1 
starting 0 
after increment 1 
starting 0 
after increment 1 

所以现在得到点..?

局部变量不保持其状态,但如果初始化局部变量始终值0

1

这是因为功能print_it所有3堆占据相同的地址空间。

// before print_it()     1st print_it();    back to main()     2nd print_it();   and so on... 
// 
// ..................    ..................   ..................    .................. 
// ... Stack data ...    ... Stack data ...   ... Stack data ...    ... Stack data ... 
// ..................    ..................   ..................    .................. 
//      <- stack_P  |call print_it()|       <- stack_P  |call print_it()| 
//            ||               ||    
//            \/               \/ 
//          ... some data ...   ... some data ...    ... some data ... 
//          | 4 bytes of x |   | X still here |    | Old X Bytes | 
//          ... some data ...   ... some data ...    ... some data ... 
//              <- stack_P             <- stack_P 
// 
//          x got incremented           x got incremented again 

试试这个主:

int main (int argc, const char * argv[]) 
{ 
    print_it(); 
    int a; 
    a += 1; 
    print_it(); 
    int b; 
    b += 2 
    print_it(); 
    exit(EXIT_SUCCESS); 
}