2012-11-14 63 views
0
void testFunc(int); 

int main(int argc, char** argv) { 

    testFunc(1); 
    testFunc(2); 
    testFunc(3); 

    return (EXIT_SUCCESS); 
} 

void testFunc(int another) 
{ 
    int num; 
    printf("num: %i\n", num); 
    num = another; 
} 

输出: 编号:127383283 人数:1 人数:2为什么这个非静态变量通过函数调用保持其值?

如果我打印变量之前我就每次分配到的东西,我不应该总是得到无用值没有static关键字?

+2

这是未定义的行为,不要浪费你的时间试图推断破碎的代码。 – Blastfurnace

回答

6

获取垃圾值 - 在这种情况下恰好如此,这些垃圾值恰好是您在前一次调用该函数时分配的值。

如果在调用testFunc()之间调用另一个函数,或者使用更高优化设置或使用其他编译器进行编译,则可能会看到完全不同的内容。

+0

好的谢谢。所以如果我将num声明为静态的,那么它应该适当地保留这个值? –

+1

@ user1438339是的。它会。 – CCoder

2

未初始化的num的值是不确定
它可以是任何东西。你不能依赖它是任何特定的。
请注意,使用此不确定的值会导致未定义的行为,所以此程序具有未定义的行为。

3

因为它最终每次都使用相同的内存来存储没有改变的变量。

此行为被视为未定义。虽然它可能在您的特定情况下可靠地工作,但不会在所有情况下都依赖它。

你为什么不开始接受一些答案,为了地狱的缘故?

+0

哈我的坏。我选择了一个,并给你一个upvote。谢谢你指出这一点,我没有意识到我一直忘记选择。 –

1

在C/C++中,您的自动变量不保证具有任何特定的值,除非您将它们初始化为您想要的值。所以这是由设计

-1

静态只是意味着它不能在编译时间后改变。一旦你声明了这个价值,它将在代码的生命周期中保持不变。由于您在函数的结尾处设置了值,因此它可以工作第二和第三次。

如果将其设置为静态,则无法将值分配给该函数。

+0

抱歉,但这是错误的。 'static'关键字与对象的存储类(生命周期)有关。 'static'关键字不会阻止您更改对象的值。 – Blastfurnace

+0

你可以分配所有你想要的静态变量。'const',另一方面,你必须初始化并且只能读取。 – chris

+0

对不起 - 完全失去了一个我的想法。是多任务处理。感谢您的更正。 – Paronity

1

这是一个意外。添加另一个功能:

int use_stack(void) 
{ 
    int a[4] = { rand(), rand(), rand(), rand() }; 
    int j = 0; 
    for (int i = 0; i < 4; i++) 
     j += a[i]; 
    return j; 
} 

称它为前两个testFunc()来电之后。您可能会在testFunc()中看到一个随机值作为“保存的值”。

形式上,你所看到的行为是未定义的行为,任何事情都可能发生。

相关问题