There's another funny thing about gcc3 behavior which I've just discovered:
$ gcc -v 2>&1 | grep version gcc version 3.4.2 $ gcc -o mem mem.c ; ./mem -1024 $ gcc -o mem1 mem1.c ; ./mem1 0 $ cat mem.c #include <stdio.h> int main() { char *p1, *p2; { char a[1024]; p1 = a; } { char a[1024]; p2 = a; } printf("%d\n", p2 - p1); return 0; } $ cat mem1.c #include <stdio.h> static const int N = 1024; int main() { char *p1, *p2; { char a[N]; p1 = a; } { char a[N]; p2 = a; } printf("%d\n", p2 - p1); return 0; } Alexey