Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将静态变量称为局部变量是否正确?_C_Variables_Memory_Static_Keyword - Fatal编程技术网

C 将静态变量称为局部变量是否正确?

C 将静态变量称为局部变量是否正确?,c,variables,memory,static,keyword,C,Variables,Memory,Static,Keyword,众所周知,C语言通过C程序中的变量支持两种内存分配: 1) 静态分配是在声明静态 变量每个静态变量定义一个固定的空间块 尺寸。当程序启动时,空间分配一次,然后 他永远不会自由 2) 当您声明自动分配时,会发生自动分配 变量,如函数参数或局部变量。空间 对于自动变量,当复合语句 输入包含声明的内容,并在该复合时释放 语句已退出 (这是一个完整的引用) 问题是:在内存分配方面,调用函数中的静态变量“local”正确吗?为什么? 提前感谢大家 注:欢迎引用C标准。你可以称它为“函数局部静态变量”或类似

众所周知,C语言通过C程序中的变量支持两种内存分配:

1) 静态分配是在声明静态 变量每个静态变量定义一个固定的空间块 尺寸。当程序启动时,空间分配一次,然后 他永远不会自由

2) 当您声明自动分配时,会发生自动分配 变量,如函数参数或局部变量。空间 对于自动变量,当复合语句 输入包含声明的内容,并在该复合时释放 语句已退出

(这是一个完整的引用)

问题是:在内存分配方面,调用函数中的静态变量“local”正确吗?为什么? 提前感谢大家


注:欢迎引用C标准。

你可以称它为“函数局部静态变量”或类似的东西,但如果你简单地称它为“局部变量”,你可能会发现人们发现它实际上是静态的时会感到惊讶,因此具有全局变量的某些属性。

C中有两种类型的静态变量

  • 全局静态变量,其中
    static
    表示这些变量只能在此翻译单元中看到

  • 具有局部scop(即函数中)的静态变量。它们初始化一次,并在超出范围后保留其值事件

  • 还有一个问题:不,变量不能同时是
    静态
    自动

    如果您检查它们的地址,您将发现
    静态
    变量不存在于当前堆栈帧上。

    C标准没有定义局部变量的术语。自动和静态是指存储持续时间

    C11(n1570),§6.2.4物体的储存期限 对象的存储持续时间决定其生存期


    在变量上下文中,术语local通常表示可见性和范围,而不是存储机制和生存期

    在C中使用术语局部变量实际上是不准确的,因为标准从来没有提到过这一点

    非正式地说,函数中的静态变量可以说是函数可见范围内的局部变量,但仅此而已

    我建议不要使用局部变量这个术语。相反,我们应该讨论函数中的静态变量、自动变量、文件范围中的静态变量和全局变量

    问题是:在内存分配方面,调用函数中的静态变量“local”正确吗?为什么

    静态变量存储在分配给程序的内存的数据段中。 即使静态变量的作用域结束,仍然可以在其外部访问它 范围,这可能表明,数据段的内容可能是独立的 范围有限

    范例

    #include <stdio.h>
    
    int increment(void);
    
    int main()
    {
    printf("\ni = %d",increment());
    printf("\ni = %d",increment());
    printf("\ni = %d",increment());
    }
    
    int increment(void)
    {
    static int i = 1;
    return i++ ;
    }
    
    #包括
    整数增量(无效);
    int main()
    {
    printf(“\ni=%d”,increment());
    printf(“\ni=%d”,increment());
    printf(“\ni=%d”,increment());
    }
    整数增量(无效)
    {
    静态int i=1;
    返回i++;
    }
    
    在上面的示例中,在每次调用increment()函数之后,每次函数返回时,函数中的静态变量i都会超出范围,但会持续
    保留其价值。这仅仅是因为变量与函数不在同一堆栈上,但它完全存在于不同的内存区域,即数据段中。

    我之所以要问这个问题,是因为据我所知,这样的变量仅在范围上是局部的。你能提供一个例子吗?@HighPredator请看一下上面的例子,以便我理解这个例子。首先,在“return”语句中,函数将控制权返回给调用方。其次,创建一个临时变量来存储递增的“i”值。我是对的吗?是的,你在某种意义上是对的,这样理解,从函数返回变量,类似于将参数传递给函数。中间有一个匿名变量被创建和销毁。请在@BarathBushan这里阅读更多关于它的信息,这取决于。当返回
    结构时(是的,这是合法的),可能发生的情况是被调用函数将结果复制到调用者提供的空间中。“全局范围”(整个程序)、“文件范围”(外部函数,但
    静态)和“块范围”(在
    {…}
    内部定义)。