静态变量不保持其范围?

时间:2014-11-14 11:07:06

标签: c static

我只是在玩这个非常简单的代码

int main()
{
    static int Z=500;
    printf("\n Value of Z is:%d",Z);
    incrementZ(Z);
    printf("\n Value of Z is:%d",Z);
    incrementZ(Z);
    printf("\n Value of Z is:%d",Z);
}

void incrementZ(static int number)
{
    number++;
}

为什么静态变量不会在这里增加?

5 个答案:

答案 0 :(得分:2)

您在Windows上,请检查this link

根据文档,static将替换为任何可用的标准存储类。有三种可能的情况,

  1. auto:if identifier是形式参数或局部变量。
  2. extern:如果标识符是函数。
  3. 无存储类:如果标识符是全局变量。
  4. 它将允许编译,只产生一个警告[C4042]说类似

      

    C4042:标识符..存储类错误


    但是,只是要添加,在linux gcc上,这将无法编译。它会抛出一个错误

      

    错误:存储类说明符在参数声明中无效

答案 1 :(得分:1)

你没有传递Z,你传递了它的价值。变量Z 维持其范围,即它在incrementZ内不可用,所以没有任何反应。

您当然可以通常的方式执行此操作,即通过&Z

此外,函数参数上的static不应该编译,这是无效的C.

答案 2 :(得分:1)

静态变量不应该是函数的参数。

Z是一个静态变量。所以你应该看Z的范围。 如果函数参数中有静态存储类,则应该看到编译器抛出错误。

答案 3 :(得分:1)

这个程序甚至不会在Linux上编译。它会抛出以下错误

  

错误:为参数'number'指定的存储类

静态变量存储在数据段中,而函数参数则在堆栈上传递。

在这种情况下,Windows不会抛出错误。

答案 4 :(得分:0)

您只是传递Z中的值而不是其地址。函数的参数也是函数的成员。因此,int数的范围仅限于其功能。请尝试以下代码以获得所需的结果。

    int main()
    {
        static int Z=500;
        printf("\n Value of Z is:%d",Z);
        incrementZ(&Z);
        printf("\n Value of Z is:%d",Z);
        incrementZ(&Z);
        printf("\n Value of Z is:%d",Z);
    }

void incrementZ(int *number)
{
    *number=*number+1
}

int * number是一个指针,incrementZ(& Z)表示您将Z的地址传递给number。 *是取消引用运算符,用于访问数字指向的值。