3

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

1)静态分配是当你声明一个静态变量时发生的。每个静态变量定义一个固定大小的空间块。当您的程序启动时,空间被分配一次,并且永远不会被释放。

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

(这是来自http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.html的完整引用)

问题是:就内存分配而言,在“本地”函数中调用静态变量是否正确,为什么?提前感谢大家。

PS 欢迎来自 C 标准的任何引用。

4

5 回答 5

4

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

C11 (n1570),§ 6.2.4 对象的存储持续时间

对象具有决定其生命周期的存储持续时间。

于 2013-02-28T12:01:42.667 回答
3

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

于 2013-02-28T11:58:23.247 回答
2

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

  1. 全局静态变量,其中static这些变量只能在这个翻译单元中看到的状态。

  2. 具有局部作用域的静态变量(即在函数中)。这些被初始化一次并在超出范围后保持它们的值事件。

你的问题是:不,一个变量不能同时是staticautomatic。如果您检查它们的地址,您会发现该static变量不在当前堆栈帧上。

于 2013-02-28T12:01:34.563 回答
2

在变量的上下文中,术语本地最常表示可见性和范围,而不是存储机制和生命周期。

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

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

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

于 2013-02-28T12:01:53.507 回答
1

问题是:就内存分配而言,在“本地”函数中调用静态变量是否正确,为什么?

静态变量存储在分配给程序的内存的数据部分中。即使静态变量的作用域结束,它仍然可以在其作用域之外被访问,这可能表明,数据段的内容,可能与作用域无关。

例子

#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++ ;
}

在上面的例子中,在每次函数调用 increment() 之后,函数内部的静态变量 i 每次函数返回时都会超出范围,但会永久保留其值。这是唯一可能的,因为变量与函数不在同一个堆栈上,但它完全存在于不同的内存区域,即数据段中。

于 2013-02-28T12:11:08.357 回答