[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