[linux-l] Arrays in C

Axel Weiß aweiss at informatik.hu-berlin.de
Di Nov 22 23:30:21 CET 2005


Oliver Bandel schrieb:
> Aber wenn man auf sowas hingewiesen wird, es zu gnorieren,
> das ist dann doof.

Hab ich da was übersehen? Hinweis? Ignoranz?

> Leider ist auch unter Linux der Programmierpfusch weit evrbreitet
> (naja, vielleicht gehört Pfusch genauso zum Mensch sein, wie
>  das fehler machen? Wer weiß ;-))

Gute Programmierer sind eben selten ;)

> Ja, wenn Du nun wieder mit Embedded anfängst....
> ... das ist dann meistens Krüppel-C, aber nicht ANI/ISO-C,
> denn sonst müssten die Compiler sich daran halten.

Ähm, im ANSI/ISO-Standard heißt die main-Funktion

	main()

Alles Weitere ist (nur) Konvention. Ein Compiler, der

main(){
	return 1;
}

klaglos übersetzt, ist (an dieser Stelle) ANSI-konform.

NB: ich kenne C-Compiler, die können nichtmal das ;)

> mit anderen Worten: Klar, wenn der Compiler nicht
> standardkonform ist (ja, davon gibt es wohl viele im
> Embedded-Bereich), dann kann sowaqs, aber auch viel anderer Müll
> vorkommen.

Ich verstehe Standardkonformität von C-Compilern hauptsächlich aus der 
Motivation heraus, portable Programme zu schreiben...

> Das ist her aber die Linux-Liste und man darf hier wohl mit
> einer soliden C-Implementierung rechnen...

... auch wenn ich ein solides System unterm Hintern habe.

> > 	if (argc <= 1){
> > 		return 1;
> > 	}
> >         execv(argv[1], argv + 1);
> >
> > sicher besser, als der blinde exec-Aufruf.
>
> Woher weißt Du, daß das korrekt gesetzt ist?
> Wenn der Compiler alles so anders macht...
> ...woher weißt Du dann, ob das abschliessende NULL
> auch drin steht in dem argv?

Na ja, ein Compiler, der execv nicht verwirft, hat zumindest eine 
Vorstellung von Programmnamen und Argumenten ;)

> Dann also besser NULL als letzten Wert übergeben, schliesslich hast Du
> selber ja gesagt, der Compiler würde manches doch recht anders machen
> als man es erwartet...

Hier möchte ich gerne rekursiv argumentieren: dieses Programm wurde durch 
exec ins Leben gerufen, also ist argv[argc] == NULL. (Wie sollte sonst 
exec argc ermitteln?)

> Also wird es doch etwas aufwändiger, diesen Aufruf durchzuführen.
> Aber drauf verlassen, daß das sauber ist, wie Du es da oben
> geschrieben hast, obwohl der Compiler auch argv[0] anders belegt, z.b.
> mit NULL, naja....

Die Belegung von argc/argv wird (zumindest bei Linux) nicht vom Compiler 
vorgenommen, sondern von dem Prozess, der das Programm mittels exec 
aufruft. Die Eigenschaft, wie argv belegt ist, ist also eine Eigenschaft 
der Programmumgebung, nicht des Compilers.

Dennoch gibt es C-Compiler, bei denen argv immer 0 ist. Aber auch hier 
ist das Ausdruck für die (fehlende) Programmumgebung.

			Axel




Mehr Informationen über die Mailingliste linux-l