为什么在 C 中允许获取函数参数的地址?
Why is taking address of function argument allowed in C?
假设我写了两个函数:
int f() {
return 1;
}
int g() {
int* x = &f();
}
我不能用 C 编译它,因为你“不能获取右值的地址”。这是有道理的,因为来自 f
的 return 值存在于寄存器中。 (也就是说,它没有要分配的地址。)
另一方面,我可以编译这个:
int h(int x) {
int* y = &x;
return 0;
}
为什么? h
的参数也存在于寄存器中,因此它不应该有地址。我误会了什么?
函数参数是具有自动存储持续时间的对象,就像函数内部的局部变量一样。
C standard 的第 6.9.1p8 节说明了以下关于函数参数的内容:
Each parameter has automatic storage duration; its identifier is an lvalue. The layout of the storage for parameters is unspecified.
并且因为函数参数是左值,所以可以取地址。
此外,尽管 C 标准没有明确规定,函数参数通常像局部变量一样驻留在堆栈中。
假设我写了两个函数:
int f() {
return 1;
}
int g() {
int* x = &f();
}
我不能用 C 编译它,因为你“不能获取右值的地址”。这是有道理的,因为来自 f
的 return 值存在于寄存器中。 (也就是说,它没有要分配的地址。)
另一方面,我可以编译这个:
int h(int x) {
int* y = &x;
return 0;
}
为什么? h
的参数也存在于寄存器中,因此它不应该有地址。我误会了什么?
函数参数是具有自动存储持续时间的对象,就像函数内部的局部变量一样。
C standard 的第 6.9.1p8 节说明了以下关于函数参数的内容:
Each parameter has automatic storage duration; its identifier is an lvalue. The layout of the storage for parameters is unspecified.
并且因为函数参数是左值,所以可以取地址。
此外,尽管 C 标准没有明确规定,函数参数通常像局部变量一样驻留在堆栈中。