关于C函数返回值的问题?

新手上路,请多包涵

以下程序在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;
阅读 945
1 个回答

这应该是vc编译器和gcc的实现差别吧
foo返回的是一个地址,即使是在堆上,它也是有效的,哪怕读不到值,或者被覆盖
我猜你切换debug/release模式得到的结果应该也不一样

这是个典型的undefined behavior(未定义行为),得到任何结果都是可能的,
如果你尝试free(m) 那么你会马上得到一个错误。

珍惜生命 远离vc

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进