将struct传递给函数

时间:2012-11-15 18:32:56

标签: c++ c struct binary


这有效:

struct client {
    string address;
    int toPay;
    int id;
};

int main() {
    struct client clients[10];
    ...
    file.read( (char*)&clients, sizeof (clients) );
}

我想做的是在函数内部做这些事情。

但是我怎么必须将结构传递给函数?

如果我通过它喜欢这个,读取不起作用:

void newFunction ( struct client *clients_t) {
    ...
    file.read( (char*)&clients_t, sizeof (clients_t) );
}

5 个答案:

答案 0 :(得分:4)

这不起作用,因为string数据未嵌入struct。相反,它有一些指向字符串内容的指针。这就是为什么file.read( (char*)&clients...)不会产生有效结果的原因:string将指向保存的string一旦指出的位置,但它将不再代表感兴趣的数据。

如果你想序列化这样的数据,在char中嵌入一个完整的struct数组,明显的限制是字符数量上限和一些浪费的空间

答案 1 :(得分:2)

移除&来电中的file.read()

所以:

file.read((char *)clients_t, sizeof(*clients_t) * 10 );

您正在传递指针本身的地址,但您想要的是结构数组的地址,并传递其正确的大小。

但是,虽然这使得read在技术上有效,但它不会为您创建string个对象,因此该片段仅适用于您已写出对您的引用的异常情况在该过程的生命周期的早期拥有对象。

作为一种学习经历,阅读和编​​写二进制数据是一个好主意。

但是,IRL通常你根本不想这样做,除非是通过DBMS。它很难调试,并且可以通过公开字节顺序来特定于体系结构。改为使用YAML,XML或CSV。

答案 2 :(得分:1)

为什么不在函数中简单地创建struct的对象。 它也会这样工作。 然后,您可以使用您创建的对象访问该函数中的结构成员。

答案 3 :(得分:1)

&clients_t是指向指针的指针。 clients_t是一个指针,它是必需的。

void newFunction ( struct client *clients_t) {
    ...
    file.read( (char*)clients_t, sizeof (clients_t) );
}

答案 4 :(得分:1)

结构只是一个对象,所以你就像处理其他对象一样对待它。

void Foo(client& ClientObj)
{
   //anything written in here directly effects the client object you passed
}

注意你需要通过引用传递,否则你只会传递对象的副本。

//in main
client CObj;
Foo(CObj);