#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;
}
答案 0 :(得分:2)
C标准没有规定如何将参数传递给函数。
平台的ABI(应用程序二进制接口)将指定如何调用函数 - 对于您已识别的方面,不同的ABI指定不同的顺序。
如果您的程序要与库或其他代码进行互操作,那么它必须像ABI所需的平台一样运行,而您的编译器显然正在这样做。
对于函数中的局部变量,编译器可以完全选择如何排列它们 - 这里没有要求与其他代码进行任何互操作,并且编译器可能会选择将它们排列为#&# 39; ve宣布他们,按类型或大小或任何其他方式收集它们。如果您从未获取变量的地址,则根本不允许为该变量分配任何存储 - 例如,它可以使用寄存器。
在这两种情况下,变量或参数所占用的具体内容都超出了标准C的范围。