变量保持其状态,即使未声明为静态

时间:2011-10-07 10:32:05

标签: c

我正在玩静态关键字。在下面的代码中,我无法弄清楚为什么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++);
    }

4 个答案:

答案 0 :(得分: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++);
}

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

没有人你错了。变量不保持其价值。你没有初始化int x所以每次它有 garbase值&amp;你正在增加那个&amp;打印增加了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。