2

我有一个这样声明的结构数组:

typedef struct {
    int a;
    int b;
} buffer_t;

buffer = (buffer_t *) calloc(SIZE, sizeof(buffer_t));

稍后在代码中我这样写:

buffer_t temp = buffer[id];
temp.a = new_a;
temp.b = new_b;

但是,当我以这种方式写信时,似乎没有任何问题。如果我这样做:

buffer[id].a = new_a;
buffer[id].b = new_b;

它工作得很好。

我在这里做错了什么?我在这里错过了一些重要的部分吗?

(我的内部循环中有这段代码,所以我想让它尽可能高效......)

如果这很重要,我正在使用 Visual C++ 2008。

4

2 回答 2

7

这是因为struct值被复制:当你写

buffer_t temp = buffer[id];

temp在 的索引处获取项目的副本id。您可以随心所欲地修改副本,但除非您将其重新分配(例如buffer[id] = temp),否则更改不会“坚持”。

使用指针解决了这个问题:

buffer_t *temp = &buffer[id];
temp->a = new_a;
temp->b = new_b;

现在temp 指向structat ,buffer[id]所以所有修改都发生在它struct本身上,而不是它的副本上。

于 2013-04-17T02:04:54.823 回答
0

创建 temp 变量时,您是在复制结构,而不是创建对它的引用。如果要使变量相互修改,可以使用参考:

buffer_t &temp = buffer[id];
temp.a = new_a
temp.b = new_b
于 2013-04-17T02:08:03.870 回答