struct值无法更改(c语言)

时间:2011-09-19 00:56:10

标签: c parameters struct

我写了一段c代码:

struct Res {
    int a;
    float b;
    double c;
};

struct Res ModRes(struct Res rrr)
{
    rrr.a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(r[0]);
    return 0;
}

r[0]之后为什么ModRes不是222?

4 个答案:

答案 0 :(得分:3)

在C中,参数按值传递。您可以让该函数接受struct Res *而不是struct Res

struct Res *ModRes(struct Res *rrr)
{
    rrr->a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(&r[0]);
    return 0;
}

答案 1 :(得分:1)

结构通过值(复制)传递给ModRes函数。所以原始值不会改变。

答案 2 :(得分:1)

您声明ModRes()是一个函数,它按值接受Res类型的结构,然后返回Res类型的结构。但是,当您从Main()调用ModRes()时,您传递了一个Res类型的结构,但没有对ModRes()返回的结果做任何事情。所以,r [0] .a没有改变。您需要将呼叫更改为:

r[0] = ModRes( r[0] );

让你的代码有效。

然而,正如其他回应帖子所表明的那样,有一个更好的方法来实现你的目标。您需要更改ModRes,以便它可以通过引用而不是值接受其参数;也就是说,您需要将指向r [0]结构的指针传递给ModRes。你的代码应该是:

void ModRes(struct Res *rrr);   // function prototype

void ModRes(struct Res *rrr)    // function definition
{ 
    rrr->a=222; 
} 

然后,在Main()中:

ModRes(&r[0]);

使用此方法生成的程序字节数通常远小于按值传递参数的程序字节数。此方法只需要将一个参数传递给ModRes:结构的地址。然后,ModRes通过该地址修改调用者的结构。它什么都不返回,因为已经进行了修改。

另一种方法将所有结构的内容复制到临时存储(通常是堆栈),并调用ModRes,然后修改该副本的元素a,将其更改为222.然后ModRes返回该副本(或者该副本)复制,取决于您的编译器)将其复制到临时存储(通常是堆栈),然后返回到调用者,然后调用者将该结构从堆栈复制回调用者的r [0]结构。

答案 3 :(得分:0)

因为您正在修改函数作为参数接收的本地副本。关于指针的研究。