以下程序在CentOS8
中运行直接会报Segementation fault
,这个应该时正常行为。 但是在Windows
环境下第一个printf
居然能正常打印值, 请大佬分析下原因。
#include <stdio.h>
int *foo(void);
int main(int argc, char* argv)
{
int *m = foo();
printf("m = %p, *m = %d\n", m, *m); // win: m = 000000000062FDDC, *m = 10
printf("m = %p, *m = %d\n", m, *m); // win: m = 000000000062FDDC, *m = 0
printf("m = %p, *m = %d\n", m, *m); // win: m = 000000000062FDDC, *m = 0
return 0;
}
int *foo(void)
{
int i = 10;
return &i;
这应该是vc编译器和gcc的实现差别吧
foo
返回的是一个地址,即使是在堆上,它也是有效的,哪怕读不到值,或者被覆盖我猜你切换debug/release模式得到的结果应该也不一样
这是个典型的
undefined behavior
(未定义行为),得到任何结果都是可能的,如果你尝试
free(m)
那么你会马上得到一个错误。珍惜生命 远离vc