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

C 即使变量未声明为静态变量,也保持其状态,c,C,我在玩静态关键字。在下面的代码中,我不明白为什么x save在state和increment之前。 我希望打印1次。据我所知,如果我将x声明为静态,就会发生这样的行为 void print_it(void); int main (int argc, const char * argv[]) { print_it(); print_it(); print_it(); exit(EXIT_SUCCESS);

我在玩静态关键字。在下面的代码中,我不明白为什么x save在state和increment之前。 我希望打印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++);
    }

您尚未将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++);
}

未初始化的局部变量的初始值未定义。在本例中,该值只是位于堆栈上并得到重用,因为您在一行中调用同一函数三次。如果调用具有局部变量的其他函数,则该值将发生更改,因为其他函数将使用相同的堆栈内存。

没有人认为您错了。变量未保持其值。您没有初始化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。

这是因为所有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

我想他遗漏了一个静态声明和x的初始化,他想在他的
print\u it
函数中引用这个x,所以行
intx=0
应该被完全删除,x应该是全局的。“因为它可能每次都使用相同的内存位置。”完全正确,变量在堆栈上,因为没有干预代码来清除它,所以它保持不变。谢谢Aamir!这就是我要找的。有时初始化自动变量总是0值。它不适用于相同的内存位置。
int main (int argc,  const char * argv[])
{
    print_it();
    int a;
    a += 1; 
    print_it();
    int b;
    b += 2
    print_it();
    exit(EXIT_SUCCESS);
}