扩展 Douglas Leeder 给出的答案:
#include <stdio.h>
static int xx(int foo)
{
int bar = 2;
if (foo > bar)
{
int foo = bar;
int bar = bar;
printf("inner: foo = %d, bar = %d\n", foo, bar);
}
printf("outer: foo = %d, bar = %d\n", foo, bar);
return bar;
}
int main(void)
{
xx(13);
return(0);
}
请注意,内部栏是从自身初始化的 - 这会产生未定义的行为。但是在 MacOS X 10.6.2 (GCC 4.2.1) 我得到:
inner: foo = 2, bar = 0
outer: foo = 13, bar = 2
变体 1:堆栈践踏 - A
有趣的是,无论我声明ibefore 还是 after ,我都会从这段代码中得到相同的输出,并带有一个堆栈践踏函数a。
inner: foo = 2, bar = 20
outer: foo = 13, bar = 2
代码:
#include <stdio.h>
static void modify_stack(void)
{
int a[20];
int i;
for (i = 0; i < 20; i++)
{
a[i] = 0xFFFFFFFF ^ i;
printf("a[i] = 0x%08X\n", a[i]);
}
}
static int xx(int foo)
{
int bar = 2;
if (foo > bar)
{
int foo = bar;
int bar = bar;
printf("inner: foo = %d, bar = %d\n", foo, bar);
}
printf("outer: foo = %d, bar = %d\n", foo, bar);
return bar;
}
int main(void)
{
modify_stack();
xx(13);
return(0);
}
由于行为未定义,因此结果很好。
变体 2:堆栈践踏 - B
#include <stdio.h>
static int modify_stack(void)
{
int a[20];
int i;
for (i = 0; i < 20; i++)
{
a[i] = 0xFFFFFFFF ^ i;
printf("a[i] = 0x%08X\n", a[i]);
}
i = a[13];
return(i);
}
static int xx(int foo)
{
int bar = 2;
if (foo > bar)
{
int foo = bar;
int bar = bar;
printf("inner: foo = %d, bar = %d\n", foo, bar);
}
printf("outer: foo = %d, bar = %d\n", foo, bar);
return bar;
}
int main(void)
{
int i = modify_stack();
xx(13);
return(i & 0xFF);
}
输出(除了循环打印的数据):
inner: foo = 2, bar = -14
outer: foo = 13, bar = 2