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