[linux-l] Arrays in C (was: SuSE 9.3 und gshadow)
Axel Weiß
aweiss at informatik.hu-berlin.de
So Nov 6 09:31:09 CET 2005
Mike Dornberger schrieb:
> Verständnisfrage: Ich hatte zuerst probiert, newargv folgendermaßen zu
> initialisieren:
>
> char *newargv[argc + 1] = { "bla", argv + 1, NULL };
Das Geht nicht. "bla" ist vom Typ char*, argv + 1 vom Typ char**, und die
kannst Du mal nicht so einfach zusammen aufzählen.
> aber das funktionierte nicht. (Wie) Kann man denn effizient ein Array
> an ein zweites dranhängen? Noch schöner wären ja Slices (ist das jetzt
> der richtige Ausdruck?), also sowas wie:
>
> char *myarray[somesize] = { oldarray[7 to 10], "bla", "blurb",
> oldarray[1 to 3], "blubb" };
In C kannst Du String*konstanten* aneinanderhängen:
"bla" "blurb" gibt zusammen "blablurb". Wirklich brauchen kann man sowas
eigentlich nur in Makros, die Strings zusammensetzen. Wenn ich z.B. den
gcc voraussetze (nur der hat ein __FUNCTION__), sieht mein
Standard-Ausgabemakro etwa so aus:
#define DEBUG(fmt, args...) \
fprintf(stderr, "%s: " fmt "\n", __FUNCTION__, ##args)
Der neue Formatstring wird jetzt zusammengesetzt und die Funktion, aus
der das Makro aufgerufen wird, mit ausgegeben.
Wie gesagt, das geht nur mit Konstanten. Sowas wie oldarray[7 to 10] gibt
es in C schonmal gar nicht (wo soll das im Speicher liegen?).
Die Initialisierung von Arrays ist in C eine Aufzählung der Elemente. Du
kannst also schreiben ...
char *myarray[somesize] = {
oldarray[7], oldarray[8], oldarray[9], oldarray[10],
'b', 'l', 'a',
'b', 'l', 'u', 'r', 'b',
oldarray[1], oldarray[2], oldarray[3],
'b', 'l', 'u', 'b', 'b', '\0'
};
> Vermute ich richtig, daß man dann doch nicht um for-Schleifen
> herumkommt?
... und ich wette, jetzt nimmst Du lieber eine for-Schleife ;)
Gruß,
Axel
Mehr Informationen über die Mailingliste linux-l