本地修改的按值传递的参数会发生什么?参数、发生

2023-09-06 18:47:05 作者:╰⒊分熟の牜扒xっ

I am well aware that modifying a function's argument that is passed by value is ineffective outside of the C/C++ function, but compilers allow it - but what happens? Is a local copy made of the argument and that is modifiable within the function?

#include <stdio.h>

void doSomething( int x )
{
    x = 42;
    printf( "The answer to Life, the Universe and Everything is (always): %i!
", x );
}

int main( int argc, char **argv )
{
    int a = 0;
    doSomething( a );
    return -a;
}

Now this always exits without error, but where in the scheme of things (memory space) is the value represented in the function as x kept?

http接口以拼接的方式传递参数 参数包含特殊字符 时,参数值发生改变

I imagine that should the (combined declaration and definition) begin:

void doSomething( const int x )

I would get my wrists slapped by any half-decent compiler.

解决方案

For the function doSomething(), x is local to the function. It has the similar scope of any other variable defined at the beginning of the function body.

In general terms, x exists only in the scope of doSomething() function. x is defined once doSomething() is called (and the argument is passed) and destroyed once the control returns. As long as the function call is being executed (i.e., the variable remains in scope), the parameter(s) are the same as any other variable, only initialized by the arguments supplied in the function call.

Quoting C11, chapter §6.2.1, Scopes of identifiers

[...] If the declarator or type specifier that declares the identifier appears inside a block or within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the end of the associated block. [...]

As you are already aware, x being the local copy of the actual argument passed to function call, any changes made to x inside the function will not reflect into the caller (actual argument), but there's no reason for the compiler to complain as long as the operation(s) on x inside the function is (are) valid.