C linux中如何为进程分配堆栈

C linux中如何为进程分配堆栈,c,stack,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,在Li

有人能帮我理解这些程序的输出吗

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,在Linux上是100 10。由于局部变量是在堆栈上分配的,所以我能够证明Windows输出的合理性。但是为什么在Linux中是100 10呢。

您的问题依赖于未定义的行为[1],所以任何事情都可能发生。您甚至不应该期望给定操作系统上的一致性:编译器选项的更改等因素可能会改变行为


[1]
fun1()
返回堆栈上变量的地址,该地址随后被取消引用。

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

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

发生的情况是,on*nix内存没有被回收,因此它还没有被覆盖,而on*win则是。但这只是猜测,最好的选择是使用调试器并遍历汇编代码。

,因此行为未定义。

在Linux(或其他操作系统)进程中,调用子例程时,本地变量的内存来自进程的堆栈区域。任何动态分配的内存(使用malloc、new等)都来自进程的堆区域。在递归期间,本地内存在函数调用期间从堆栈区域分配,并在函数执行完成时清除

内存被表示为最低地址在底部,最高地址在顶部。下面是使用快速C代码查找递归中堆栈增长方向的步骤

#include <stdio.h>

void test_stack_growth_direction(recursion_depth) {
  int local_int1;
  printf("%p\n", &local_int1);
  if (recursion_depth < 10) {
    test_stack_growth_direction(recursion_depth + 1);
  }
}

main () {
  test_stack_growth_direction(0);
}
ubuntu上的输出

0x7ffffeec790c
0x7ffffeec78dc
0x7ffffeec78ac
0x7ffffeec787c
0x7ffffeec784c
0x7ffffeec781c
0x7ffffeec77ec
0x7ffffeec77bc
0x7ffffeec778c
0x7ffffeec775c
0x7ffffeec772c
随着内存地址的减少,堆栈在这些特定设置上向下增长。这取决于系统的体系结构,对于其他体系结构可能有不同的行为。0x7fff6f9e8868

0x7ffffeec790c
0x7ffffeec78dc
0x7ffffeec78ac
0x7ffffeec787c
0x7ffffeec784c
0x7ffffeec781c
0x7ffffeec77ec
0x7ffffeec77bc
0x7ffffeec778c
0x7ffffeec775c
0x7ffffeec772c