在符合C89 / C99的编译器上使用函数参数的地址是否安全/可移植?
例如,如果函数参数满足特定的大小和对齐要求,则32位ARM的AAPCS使用寄存器r0-r3进行参数传递。我会假设使用通过寄存器传递的参数的地址会产生意外的结果,但我对我正在使用的ARM编译器运行了测试,如果代码尝试引用地址,它似乎将这些参数重定位到堆栈这些参数。虽然它在我的特定应用程序中似乎是安全的,但我想知道这是否可以保证跨架构(使用符合ANSI / ISO的编译器)可以直接利用寄存器来传递函数参数。
标准是否定义了此行为?
答案 0 :(得分:8)
在C中,唯一不能获取地址的左值是位域(不能出现在函数参数中)和register
存储类的变量或函数参数。获取参数的地址是完全安全的,但请记住,参数是按值传递的,因此您必须确保在其生命周期结束时不使用局部变量或参数的地址。
通常,编译器有一个传递,它检查哪些局部变量和参数是一元&
运算符的操作数。然后在适当时将它们复制到合适的RAM中。调用约定不会影响这一点。