在c中定义并返回一个结构

时间:2010-06-10 12:36:08

标签: c struct return-value

我正在尝试将一些代码从Javascript转换为c。该函数创建一个数组(始终具有固定数量的项),然后返回该数组。我已经了解到,在c中返回一个数组并不简单,所以我想将它作为结构返回。我的c并不是那么好,所以我想检查在这种情况下返回结构是正确的,并且我正在以正确的方式进行。感谢。

typedef struct {
    double x;
    double y;
    double z;
} Xyz;

Xyz xyzPlusOne(Xyz addOne) { 

    Xyz xyz;
    xyz.x = addOne.x + 1;
    xyz.y = addOne.y + 1;
    xyz.z = addOne.z + 1;

    return xyz;
}

4 个答案:

答案 0 :(得分:8)

这是非常好的和正确的C,但是按值传递结构对于较大的结构或者如果您打算更改调用者中的结构可能不是一个好主意:

Xyz s;
s = XyzPlusOne( s );

在这种情况下,最好将结构作为指针传递,只需说:

Xyz s;
XyzPlusOne( & s );

另一方面,如果你想要这样的东西:

Xyz s1, s2;
...,
s2 = XyzPlusOne( s1 );

然后返回一个值是有意义的。

答案 1 :(得分:3)

这应该可以正常工作,但是如果你想保持原始结构完整,你可能希望让它传递一个指向结构的const指针,以避免另外复制它:

Xyz xyzPlusOne(const Xyz* addOne) { 

    Xyz xyz;
    xyz.x = addOne->x + 1;
    xyz.y = addOne->y + 1;
    xyz.z = addOne->z + 1;

    return xyz;
}

或者你可以传递一个常规指针到结构,在函数中更改它,而不是返回任何东西(如果你不需要保持原始结构完整):

void xyzPlusOne(Xyz* addOne) { 
    addOne->x++;
    addOne->y++;
    addOne->z++;
}

答案 2 :(得分:2)

这看起来它可以与现代编译器一起使用,但它是一种非C类方法。在C中,您更有可能通过引用传递结构并且不返回任何内容。

答案 3 :(得分:2)

这是另一种只修改原始数组的方法:

void xyzPlusOne(Xyz *addOne)
{ 
    if (addOne != NULL)
    {
        addOne->x++;
        addOne->y++;
        addOne->z++;
    }
}

调用:xyzPlusOne(& array);