为什么我不能用这种方式写入C中的结构数组?

c00*_*ter 2 c arrays struct

我有一个以这种方式声明的结构数组:

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

buffer = (buffer_t *) calloc(SIZE, sizeof(buffer_t));
Run Code Online (Sandbox Code Playgroud)

稍后在代码中我写这样:

buffer_t temp = buffer[id];
temp.a = new_a;
temp.b = new_b;
Run Code Online (Sandbox Code Playgroud)

但是当我这样写的时候似乎没有什么可以坚持下去的.如果我这样做:

buffer[id].a = new_a;
buffer[id].b = new_b;
Run Code Online (Sandbox Code Playgroud)

它工作得很好.

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

(我的内循环中有这个代码所以我想尽可能高效...)

如果重要的话,我正在使用Visual C++ 2008.

das*_*ght 7

这是因为struct复制值:写入时

buffer_t temp = buffer[id];
Run Code Online (Sandbox Code Playgroud)

temp获取索引处的项目副本id.您可以根据需要修改副本,但除非您将其分配(例如buffer[id] = temp),否则更改不会"粘住".

使用指针修复此问题:

buffer_t *temp = &buffer[id];
temp->a = new_a;
temp->b = new_b;
Run Code Online (Sandbox Code Playgroud)

现在temp structbuffer[id],所以所有的修改发生在struct本身,而不是它的副本.