繁体   English   中英

将结构传递给C中的函数

[英]Passing a struct to a function in C

如果我有以下情况:-

struct foo
{
  int a;
  int *b;
} bar;

void baz(struct foo qux)
{

}

我是否正确认为将bar传递给baz()导致将bar的本地副本推入堆栈? 如果是这样,这是什么副本? 在C ++中,我假设它将调用复制构造函数或默认的复制构造函数,但我真的不知道在C中如何工作。

C是否具有默认副本构造函数的概念,并且它具有名称吗? 可以做一些事情来执行深层复制吗? (假设)。 我能想到的唯一方法是实际进行深层复制,然后将其传递给函数。

通常,我会传递一个指向foo的指针,但是我只是对它的工作方式感到好奇。 此外,我的印象是传递指针的速度更快,节省内存,并且是进行此类操作时建议采取的措施。 我想这是一个浅表副本; 可以改变吗?

我是否正确认为将bar传递给baz()会导致将bar的本地副本推入堆栈?

是。

我真的不知道如何在C中工作。

基本上与C ++中的默认复制构造函数相同; 副本的每个字段都使用原始文档的相应字段初始化。 当然,由于“仿佛”规则,整个事情可能会归结为一memcpy

我的印象是传递指针更快,节省内存,并且是进行此类操作时建议采取的措施。

对于较大的struct ,通常是这种情况,但并非总是如此。 如果您的struct只有几个小字段,那么复制的开销可能会比间接的开销小(同样,使用指针参数可能会很昂贵,因为C和C ++的别名规则会阻止某些优化)。

我想这是一个浅表副本; 可以改变吗?

不,默认复制构造函数会发生浅复制(盲复制每个字段)的情况(使用“深复制”通常意味着还创建指针/引用字段中引用的每个对象的副本)。

您的意思是“按引用传递”,不是允许最大灵活性(以及与原始类型传递的一致性)的默认值。 如果要通过引用传递,则传递一个指针(或C ++中的引用),如果只是出于性能考虑,则通常传递const ,否则传递对象本身。

是的,bar的本地副本被压入堆栈。 其余部分将在以下工作示例中进行评论。

    #include <stdio.h>
    struct foo
    {
        int a;
        int *b;
    } bar;
    void baz(struct foo qux)
    {
        bar.a = 2; // if its a different copy then printf on main should print 1 not 2.
        *bar.b = 5; // if its a different copy then printf on main should print 5 not 4. since the place pointer pointing to is same
    }
    int main(){
        bar.a=1;
        bar.b = (int*)malloc(sizeof(int));
        *bar.b = 4;
        baz(bar); // pass it to baz(). now the copy of bar in the stack which is what baz going to use
        printf("a:%d | b:%d\n",bar.a,*bar.b);
        //answer is  2 and 5
        /*So indeed it does a shallow copy thats why we lost the "4" stored in bar.b it did not created new space in heap to store "5" instead it used the same space that b was pointing to.
        */
    return 0;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM