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