我不是一名 C 程序员,但最近我越来越感兴趣。据我了解,在 C 函数中参数是按值传递的,这解释了为什么 v1 不变。
我不明白的是为什么在 stack_copy 返回后 v2 具有正确的值。我的理解是,函数参数被放在堆栈上,并且应该在函数作用域结束时释放,所以我希望 v2 包含垃圾。
这是怎么回事?
注意:我在 Windows 上使用 Visual Studio 2015 编译器并在 OSX 上使用 clang 在 C 语言中对此进行了测试。
#include "assert.h"
typedef struct {
int x;
int y;
int z;
} Vec3;
Vec3 stack_copy(Vec3 v) {
v.x = 3;
v.y = 3;
v.z = 3;
return v;
}
int main() {
Vec3 v1 = {7, 7, 7 };
Vec3 v2 = stack_copy(v1);
assert(v1.x == 7 && v1.y == 7 && v1.z == 7);
assert(v2.x == 3 && v2.y == 3 && v2.z == 3);
return 0;
}
最佳答案
我假设您了解 C 中“按值调用”的概念,即您不会询问看似引用的参数(C++ 风格)。
否则她是关于该主题的一个很好的问答Parameter Passing in C - Pointers, Addresses, Aliases
您在这个问题中的重点是结构类型值的返回。
同样的情况也会发生在“退出时”,即将值复制回函数的返回值所分配的位置。
这对于结构类型值与任何其他类型值没有什么不同。
我假设您在查看此示例时没有想到您的问题:
int stack_copy(int v) {
v = 3;
return v;
}
关于C 返回函数参数。为什么这有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585102/