2 votes

Pourquoi ne peux-je pas écrire dans mon tableau de structures en C de cette façon?

J'ai un tableau de structures déclaré de cette manière :

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

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

Plus tard dans le code, j'écris dedans de cette manière :

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

Mais rien ne semble rester quand j'écris de cette façon. Si je fais plutôt ceci :

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

Ça fonctionne très bien.

Qu'est-ce que je fais de travers ici ? Est-ce que je manque une partie vitale ici ?

(J'ai ce code dans ma boucle interne donc j'aimerais le rendre aussi efficace que possible...)

Je suis en train d'utiliser Visual C++ 2008 si ça importe.

7voto

dasblinkenlight Points 264350

Cela est dû au fait que les valeurs de struct sont copiées : lorsque vous écrivez

buffer_t temp = buffer[id];

temp obtient une copie de l'élément à l'index de id. Vous pouvez modifier la copie comme bon vous semble, mais sauf si vous l'assignez de nouveau (par exemple buffer[id] = temp), les modifications ne vont pas "coller".

Utiliser un pointeur résout ce problème :

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

Maintenant temp pointe vers la struct à buffer[id], ainsi toutes les modifications se font sur la struct elle-même, et non sur sa copie.

0voto

Silvio Mayolo Points 13050

Lorsque vous créez la variable temporaire, vous copiez la structure, vous ne créez pas de référence à celle-ci. Si vous souhaitez que les variables se modifient mutuellement, vous pouvez utiliser une référence :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X