C 返回函数参数。为什么这有效?

标签 c

我不是一名 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/

相关文章:

C EOF 符号值和符号字符

c - Bron-Kerbosch C 实现

c - 段错误 C : malloc(sizeof(char*)*3)

c - 处理 IRP_MJ_SHUTDOWN

c - 我的字符串连接每次结果都会加倍,为什么?

c - 需要左值作为赋值的左操作数 - 函数指针

c - 文件结束 (EOF) 的方法在 NetBeans 控制台中不起作用

c - 我无法让这个程序正常工作。

c - 声音播放器无法读取我的程序生成的 WAV 文件,提示缺少 header

c++ - 即使文件描述符不可用,也能有效地监听多个套接字