首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将结构传递给C语言中的函数

将结构传递给C语言中的函数
EN

Stack Overflow用户
提问于 2013-04-19 06:10:41
回答 2查看 359关注 0票数 5

如果我有以下信息:

代码语言:javascript
复制
struct foo
{
  int a;
  int *b;
} bar;

void baz(struct foo qux)
{

}

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

C有没有默认拷贝构造函数的概念,有没有名字?可以做些什么来执行深度复制吗?(假设)。我能想到的唯一方法就是做一个深度拷贝,然后把它传递给函数。

通常,我会传递一个指向foo的指针,但我只是好奇它是如何工作的。此外,我的印象是,传递指针更快,节省内存,并且是执行此类操作时建议采取的操作过程。我猜这是一个浅显的拷贝;这可以改变吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-19 06:18:50

将bar传递给baz()会导致bar的本地副本被推送到堆栈上,这样的想法正确吗?

是。

,我真的不知道这在C语言中是如何工作的。

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

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

对于较大的struct通常是这样的,但并不总是这样;如果您有一个由几个小字段组成的小struct,复制的开销可能会比间接复制的开销小(而且,使用指针参数的开销可能会很高,因为C和C++的别名规则可能会阻止某些优化)。

我猜这是一个浅拷贝;这可以改变吗?

不,浅复制(盲目复制每个字段)是使用默认复制构造函数所发生的(而使用“深复制”通常是指创建指针/引用字段中引用的每个对象的副本)。

您的意思是“通过引用传递”,它不是默认的允许最大的灵活性(以及为了与原始类型的传递保持一致)。如果你想通过引用传递,你需要传递一个指针(或者C++中的引用),如果你只是为了提高性能,通常是const,否则你传递对象本身。

票数 4
EN

Stack Overflow用户

发布于 2013-04-19 06:34:39

是的,bar的本地副本被推送到堆栈上。并在下面的工作示例中对rest进行了评论。

代码语言:javascript
复制
    #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;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16093945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档