在C中,Mac OS和Windows操作系统中的堆栈分配怎么样?

时间:2017-06-14 11:17:10

标签: c

#include <stdio.h>
void f(int a, int b, int c)
{
    printf("%p, %p, %p", (void*)&a, (void*)&b, (void*)&c);
}
int main(int argc, char* argv[])
{
    int a = 0;
    int b = 0;
    int c = 0;
    f(a, b, c);
    return 0;
}

在Windows中,结果按升序排列。但是,在mac中,结果是降序。我不知道为什么。

但是,下面的代码结果在mac os和windows os中按降序排列。

#include <stdio.h>
int main(int argc, char* argv[])
{
    int a = 0;
    int b = 0;
    int c = 0;
    printf("%p, %p, %p", (void *)&a, (void *)&b, (void *)&c);
    return 0;
}

并且,以下代码的结果在mac os和windows os中是相同的:“ba”。

#include <stdio.h>
void f(int a, int b)
{}
int main(int argc, char* argv[])
{
    f(printf("a"), printf("b"));
    return 0;
}

1 个答案:

答案 0 :(得分:2)

C标准没有规定如何将参数传递给函数。

平台的ABI(应用程序二进制接口)将指定如何调用函数 - 对于您已识别的方面,不同的ABI指定不同的顺序。

如果您的程序要与库或其他代码进行互操作,那么它必须像ABI所需的平台一样运行,而您的编译器显然正在这样做。

对于函数中的局部变量,编译器可以完全选择如何排列它们 - 这里没有要求与其他代码进行任何互操作,并且编译器可能会选择将它们排列为#&# 39; ve宣布他们,按类型或大小或任何其他方式收集它们。如果您从未获取变量的地址,则根本不允许为该变量分配任何存储 - 例如,它可以使用寄存器。

在这两种情况下,变量或参数所占用的具体内容都超出了标准C的范围。