C 从函数标准内部修改参数指向的对象是否符合标准?

C 从函数标准内部修改参数指向的对象是否符合标准?,c,function,pointers,parameters,language-lawyer,C,Function,Pointers,Parameters,Language Lawyer,如果函数修改了它接收到指针的对象,那么在函数调用之后,调用方中是否可以看到该更改 a单元: 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标准对其进行备份。

如果函数修改了它接收到指针的对象,那么在函数调用之后,调用方中是否可以看到该更改

a单元:

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)函数可以更改其参数的值,但这些更改不会影响参数的值。另一方面,可以传递指向对象的指针,然后函数可以更改指向的对象的值。。声明为具有数组或函数类型的参数将调整为具有pointer类型如6.9.1所述。”

“我非常确定,但我希望基于C标准对其进行备份。”

虽然这是一个非常基本的问题(您可能已经知道),但以下是您想要的完全符合标准的报价:

ISO/IEC 9899:2018(C18),“函数调用”6.5.2.2/4(重点):


参数可以是任何完整对象类型的表达式。在准备调用函数时,对参数进行求值,并为每个参数分配相应参数的值。97)

97)函数可以更改其参数的值,但这些更改不会影响参数的值。另一方面,可以传递指向对象的指针,然后函数可以更改指向的对象的值。。声明为具有数组或函数类型的参数将调整为具有pointer类型如6.9.1所述。”



我不知道为什么我们需要深入研究这方面的标准。这是基本的C,答案显然是肯定的。也许我遗漏了一些东西,但是您对此有什么具体的疑问,我们需要仔细检查标准以进行检查?可以保证,如果您在函数调用后访问此变量,它将具有更新的值。在此之前,编译器可能会改变执行顺序,只要它对您不可见。对此我毫不怀疑。不过,即使是最基本、最明显的行为也应该由C标准来定义。@undur_Gongo或它与标准无关,它与指针的一般工作方式有关。我能理解他,最好总是证明一切。问题不是他不知道它会这么做。OP希望完全符合标准,这始终是一个良好的意图。我不知道为什么我们需要深入研究这方面的标准。这是基本的C,答案显然是肯定的。也许我遗漏了一些东西,但是您对此有什么具体的疑问,我们需要仔细检查标准以进行检查?可以保证,如果您在函数调用后访问此变量,它将具有更新的值。在此之前,编译器可能会改变执行顺序,只要它对您不可见。对此我毫不怀疑。不过,即使是最基本、最明显的行为也应该由C标准来定义。@undur_Gongo或它与标准无关,它与指针的一般工作方式有关。我能理解他,最好总是证明一切。问题不是他不知道它会这么做。OP希望完全符合标准,这始终是一个良好的意图。@undur_gongor您指的是Alex Lop。在你的问题下?@undur_gongor我认为他的意思与你所想的不同:
qux
在执行
baz
之前可能仍然具有
0
的值,但是
qux
必须在
baz
返回后为
42
。很抱歉不清楚。一位同事争辩说,编译器可以在调用baz之后,仍然使用以前的qux值(因此这个问题)进行优化。不知何故,这应该被序列点所覆盖。@undur_gongor,嗯,这可能是可能的,但我不确定。但如果可能的话,它可能会违反标准的规则。我想你应该问另一个单独的、有针对性的问题(引用你同事的话,如果可能,如何可能,是否符合标准。@undur_gongor你是指Alex Lop。在你的问题下?@undur_gongor我认为他的意思与你的想法不同:
qux
在执行
baz
之前可能仍然具有
0
的值,但是e> 在返回
baz
之后,qux必须是
42
。很抱歉不清楚。一位同事认为编译器可以优化,在调用baz之后,仍然使用以前的qux值(因此这个问题)。无论如何,这应该由顺序点来覆盖。@undur_gongor,嗯,这可能是可能的,但我不确定。但如果可能的话,它可能会违反标准的规则。我想你应该问另一个单独的、有重点的问题(如果可能、如何可能以及是否符合标准)。