Расширение ответа Дугласа Лидера:
#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
Интересно, я получаю тот же вывод из этогокод, с функцией выталкивания стека, независимо от того, объявляю ли я i
до или после 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