Ich verstehe, dass C ist (meist) aufrufen und zuweisen "nach Wert", und dass struct
Zuweisung a = b
erstellt eine Kopie von b
.Idiom für Aliasing-Strukturen
Dies führt zu etwas Ausführlichkeit beim Iterieren durch ein Array, dessen Mitglieder struct
sind, und den Zugriff auf Mitgliedsfelder (Beispiel unten). Gibt es ein Idiom für Aliasing-Strukturen in einer Schleife?
#include <stdio.h>
#define N_FOOS 2
struct Foo {
char *bar;
char *baz;
};
int main() {
struct Foo foos[N_FOOS] = {
{"foo", "bar"},
{"baz", "qux"},
};
for (int i = 0; i < N_FOOS; ++i) {
printf("foos[%d].bar = %s\n", i, foos[i].bar);
printf("foos[%d].baz = %s\n", i, foos[i].baz);
}
}
In einer höheren Programmiersprache würde ich einen Alias innerhalb for
erstellt haben foos[i]
und vermeiden wiederholte Indizierung zu zeigen.
Wäre die idiomatische Methode, einen Zeiger zu erstellen, der auf foos[i]
verweist?
int main() {
struct Foo *foo;
struct Foo foos[N_FOOS] = {
{"foo", "bar"},
{"baz", "qux"},
};
for (int i = 0; i < N_FOOS; ++i) {
foo = &foos[i];
printf("foos[%d].bar = %s\n", i, foos[i].bar);
printf("foos[%d].baz = %s\n", i, foos[i].baz);
printf("foo->bar = %s\n", foo->bar);
printf("foo->baz = %s\n", foo->baz);
}
}
Der Nachteil manuelle Aufhebung der Zuordnung zu tun hat, aber ich denke, dass nur ein unausweichlicher Teil der Sprache ist.
EDIT: fixed-Code aufgrund @ dbush Feedback
Wenn Sie nicht fast alle Optimierungen ausschalten, würde jeder vernünftige Compiler den gemeinsamen Teilausdruck optimieren und würde nicht zweimal indexieren, so dass Sie in den meisten Fällen nicht so viel darüber nachdenken müssen. Der malloc ist überflüssig und das free ist eigentlich ein Fehler. – pvg
Es könnte vom Compiler weg optimiert werden, aber es sind noch mehr Zeichen zu tippen (mein Ausgangspunkt). Dieser Kommentar wäre auch besser, wenn er erklärt, warum "malloc" überflüssig und "frei" ein Fehler ist. – yangmillstheory
Ich bin nicht sicher, wie ich es erklären soll, weil ich nicht verstehe, warum Sie malloc benutzt haben und dann etwas anderes freigegeben haben, als das, was Sie mallociert haben. Wenn Sie Ihr Denken erklären, wäre es vielleicht einfacher, darüber zu sprechen, wo es schief gelaufen ist. – pvg