如果一个函数修改了它接收到的指针的对象,那么在函数调用之后调用者中是否可以看到该更改?
单元一:
void foo(int *bar) { *bar = 42; }
b单元:
extern void foo(int *bar);
void baz(void) {
int qux = 0;
foo(&qux);
// Is qux guaranteed to be 42 now?
}
我很确定是这样,但我想根据 C 标准对其进行备份。
如果一个函数修改了它接收到的指针的对象,那么在函数调用之后调用者中是否可以看到该更改?
单元一:
void foo(int *bar) { *bar = 42; }
b单元:
extern void foo(int *bar);
void baz(void) {
int qux = 0;
foo(&qux);
// Is qux guaranteed to be 42 now?
}
我很确定是这样,但我想根据 C 标准对其进行备份。
“我很确定它是,但我希望根据 C 标准对其进行备份。 ”
尽管这是一个非常基本的问题(您可能已经知道),但这里是提供您想要的完整标准合规性的报价:
ISO/IEC 9899:2018 (C18),“函数调用”6.5.2.2/4(强调我的):
"参数可以是任何完整对象类型的表达式。在准备调用函数时,会计算参数,并为每个参数分配相应参数的值。97)
97) 函数可以更改其参数的值,但这些更改不会影响参数的值。另一方面,可以传递一个指向对象的指针,然后函数可以更改指向的对象的值。声明为数组或函数类型的参数被调整为具有 6.9.1 中所述的指针类型。"