c - linux中进程是如何分配栈的

标签 c stack

谁能帮我理解这些程序的输出。

int* fun1();
void fun2();

int main()
{
    int *p=fun1();
    fun2();
    printf("%d\n",*p);

    return 0;
}

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

void fun2()
{
    int a=100;
    printf("%d\n",a);
}

在 Windows 上是 100 100,在 Linux 上是 100 10。由于局部变量是在堆栈上分配的,因此我能够证明 Windows 输出是合理的。但是在 Linux 中为什么是 100 10。

最佳答案

返回指向超出范围的堆栈分配变量的指针并使用该指针是未定义的行为,纯粹而简单。

但我猜答案“任何事情都有可能发生”对你来说并不合适。

发生的事情是,在 *nix 上,内存没有被回收,所以它还没有被覆盖,而在 win 上,它被覆盖了。但这只是一个猜测,您最好的选择是使用调试器并遍历汇编代码。

关于c - linux中进程是如何分配栈的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063957/

相关文章:

c++ - Linux 上最快的截屏方法

c - 此TRIE算法代码在CS50 IDE编译器上运行,但在Windows上的TDM-GCC中进入无限循环

c++ - 如何使用模板泛化容器适配器?

java - 降低内循环的时间复杂度 : Find count of elements greater than current element in the first loop and store that in solved array

c++ - 在递归函数中声明一个静态变量。堆栈溢出

c - 使用 linux 内核中定义的结构时出错

c - DeleteFile 和 FindFirstFile 如何交互?

c - 非 void 函数中的 return 命令是否必要?

为具有两个参数的单向链表创建 push() 方法

c++ - 堆叠推和弹出功能不起作用