关于C函数返回值的问题

#include <stdio.h>

int *foo(void);

int main(int argc, char* argv)
{
    int *m = foo();
    printf("m = %p, *m = %d\n", m, *m); // m = 000000000062FDDC, *m = 10
    printf("m = %p, *m = %d\n", m, *m); // m = 000000000062FDDC, *m = 0
    printf("m = %p, *m = %d\n", m, *m); // m = 000000000062FDDC, *m = 0
    printf("m = %p, *m = %d\n", m, *m); // m = 000000000062FDDC, *m = 0
    printf("m = %p, *m = %d\n", m, *m); // m = 000000000062FDDC, *m = 0

    return 0;
}

int *foo(void)
{
    int i = 10;
    return &i;
}

为什么第一个printf汉能拿到值,函数返回时不应该被销毁了吗?

这段程序在CentOS中直接会报Segementation fault,这个行为我可以理解。 但是在Windows中第一个printf居然总能返回正确的值