将结构/联合传递给 C 中的函数

问题描述 投票:0回答:3

C 编译器如何向函数传递结构体/联合体以及从函数返回结构体/联合体?结构体是否在函数调用之前被压入堆栈?是否只是传递给函数的结构体引用?

同样的问题也适用于退货。该函数到底返回什么?

typedef struct {
    long m4;
    long m3;
    long m2;
    long m1;
} ext_components_t;

typedef union { 
    long array[sizeof(int_components_t)];
    int_components_t comp;
} int_components_u;

typedef union {
    long array[sizeof(ext_components_t)];
    ext_components_t comp;
} ext_components_u;

#pragma never_inline
ext_components_u transfer(int_components_u m) 
{
    ext_components_u out;
    out.comp.m1 = 10*m.comp.a+11*m.comp.b+12*m.comp.c;
    out.comp.m2 = 20*m.comp.a+21*m.comp.b+22*m.comp.c;
    out.comp.m3 = 30*m.comp.a+31*m.comp.b+32*m.comp.c;
    out.comp.m4 = 40*m.comp.a+41*m.comp.b+42*m.comp.c;
    return out;
}

volatile int_components_u x;
volatile ext_components_u y;
void main()
{
    y = transfer(x);
}

这是我的猜测(伪代码):

push_stack(x.array[0])
push_stack(x.array[1])
push_stack(x.array[2])

call transfer

y.array[0] = shift_stack()
y.array[1] = shift_stack()
y.array[2] = shift_stack()
y.array[3] = shift_stack()

或者另一种解决方案可能是:

call transfer(&x)
y.array[0] = shift_stack()
y.array[1] = shift_stack()
y.array[2] = shift_stack()
y.array[3] = shift_stack()
c pointers struct
3个回答
7
投票

在 C 中,函数的所有参数都是按值传递的。这意味着结构和联合在传递给函数时会被“复制”。如何处理复制是特定于实现的,但最常见的方法是在堆栈上分配空间并将结构/联合的内容复制到该空间中。 返回数据也是如此,它是按值返回的(即复制的)。

这里有一件重要的事情需要注意,那就是C没有引用传递。当您传递指针时,
指针

是按值传递的,即它被复制。 但是,您可以使用指针来

模拟

通过引用传递。


2
投票

实现可以以不同的方式传递一个 int 和一个仅包含 int 成员的结构。同样的规则也适用于工会。

有些书说“参数通过从右到左压入堆栈来传递给被调用的函数”。这是过于简单化了。 (摘自 Peter Van der Linden 的《专家 C 编程深 C 秘密》)


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.