【发布时间】:2015-01-10 17:57:59
【问题描述】:
我相信答案是没有链接,因为标准只保证具有静态存储持续时间的文件范围标识符具有内部链接。但是,似乎递归调用具有静态存储持续时间的标识符的函数不会为局部变量强加额外的内存。换句话说,在递归过程的任何阶段,标识符总是表示同一个对象,这很奇怪,因为它没有链接。这是为什么呢?
void recursive(void) {
static int a;
printf("%d", &a); // it repeatedly spits out the same address.
recursive();
}
【问题讨论】:
-
为什么不吐出同一个地址?声明
astatic的全部意义在于使其在调用中持久化。 -
而且它没有基本情况。所以在某一时刻它会耗尽所有堆栈空间......
-
它肯定是与包含函数相同的链接。只有自动变量没有链接。
-
@jamesdlin 我同意这应该是考虑到堆栈的方式。但是,在我看来,它有点像链接,因为每个新的 a 都表示同一个对象(=链接的用途)!
-
联动与您观察到的行为无关。链接是关于将对象名称解析为对象地址的规则。通常,当涉及多个翻译单元(即多个 obj 文件)、共享库等时,它就会发挥作用。
标签: c