Christoph: (C) Grundsatzfragen zu Zeiger

Beitrag lesen

Moin.

Falls ich mal so direkt sein darf: dein Code ist Käse. Im einzelnen:

#include <stdio.h>

int main(int argc, char *argv[0])  { // 1.

int c;

printf("Alle Zeichen der Argumente einzeln ausgeben...\n");
while (argc-- > 0)   { // 2.
while (*argv)   { // 3.
  while ( (c = ((argv))++ ) != '\0')  {
   printf("%c\n", c);
  }
  *argv++; // 4.
}
}

return 0;
}

  
1\. ISO-C verbietet Arrays der Länge 0 - nutze statt dessen die Deklaration `char \* argv[]` oder `char \*\* argv`  
  
2\. `argv` ist ein Array von Zeigern auf Arrays von Zeichen, d.h. zum Durchlaufen aller Zeichen genügen zwei Schleifen - dein Algorithmus ist 'kaputt'  
  
3\. die Schleife `while(\*argv)` bricht nur ab, weil der Zeiger `argv[argc]` zufällig (oder aus Compiler-Toleranz) ein Null-Zeiger ist - das ist keinesfalls garantiert, d.h. du hast hier einen potentiellen Überlauf  
  
4\. die Dereferenz `\*argv++` ist unnötig, da du den Wert an der Stelle `argv` nie verwendest, ein `argv++` genügt  
  
Übersichtlicher geht das ganze z.B. so:  
~~~c
  
#include <stdio.h>  
  
int main(int argc, char * argv[])  
{  
	printf("Alle Zeichen der Argumente einzeln ausgeben...\n");  
  
	for(int i = 0; i < argc; ++i)  
	{  
		for(char * c = argv[i]; *c; ++c)  
			printf("%c\n", *c);  
	}  
  
	return 0;  
}  

Falls du den GCC verwendest, ist der Code mit der Option std=c99 oder std=gnu99 zu kompilieren.

Christoph