我认为答案是没有联系,因为标准只保证具有静态存储持续时间的文件范围标识符具有内部链接。但是,似乎对具有静态存储持续时间的标识符的函数的递归调用不会为局部变量强加额外的内存。换句话说,在递归过程的任何阶段,标识符总是表示相同的对象,这是奇怪的,因为它没有链接。那是为什么?
void recursive(void) {
static int a;
printf("%d", &a); // it repeatedly spits out the same address.
recursive();
}
答案 0 :(得分:3)
本地静态变量没有链接(或者更确切地说,它们的链接是 none )。从N1570(C11草案)6.2.2 标识符的链接(强调我的):
6)以下标识符没有链接:声明为的标识符 是对象或功能以外的任何东西;声明的标识符 成为一个函数参数;对象的块范围标识符 声明没有存储类说明符
extern
。
但static
说明符强制要求此变量具有静态存储持续时间,这是一种不同的事情。你所指的是对象的一生。这些变量表示具有整个程序执行生命周期的对象,并且在程序实际启动之前在概念上进行一次初始化。
6.2.4 对象的存储持续时间:
2)对象的生命周期是程序执行期间的部分 保证保留哪个存储空间。存在一个对象, 具有固定地址, 33)且保留其最后存储的值 在整个生命周期中。 34)如果一个物体被引用到它的外面 一生,行为是不确定的。指针的值变为 当它指向(或刚刚过去)的对象到达时不确定 它的一生结束。
3)在没有存储类的情况下声明其标识符的对象 说明符
_Thread_local
,并且具有外部或内部链接或存储类说明符static
,具有静态存储持续时间。它的 lifetime是程序及其存储值的完整执行 在程序启动之前只初始化一次。