2016-03-27 12 views
2

Warum hört das nach dem Kompilieren auf zu laufen? Es gibt die Ausgabe korrekt, aber direkt danach korrumpiert es.Zeigerarrays, gestoppt ausgeführt

#include <stdio.h> 


    int main() { 

     char *cities[] = {"Adiyaman","Kayseri","Istanbul"}; 

     int i; 

     for(i=0; *(cities+i) != NULL; i++) { 

      printf("%s\n",*(cities+i)); 

     } 

     return 0; 
} 

Antwort

1

definiert das Array die folgende Art und Weise

char *cities[] = { "Adiyaman","Kayseri","Istanbul", NULL }; 

Andernfalls wird die Schleife nicht funktionieren, weil die Anordnung nicht ein Element hat, das gleich NULL ist.

Es wäre einfacher, die Schleife die folgende Art und Weise

for (i = 0; i != sizeof(cities)/sizeof(*cities); i++) { 

     puts(cities[i]); 

    } 

Oder wenn Sie Zeiger verwenden, dann

for (char **p = cities; p != cities + sizeof(cities)/sizeof(*cities); p++) { 

     puts(*p); 

    } 
+0

Ja, ich habe das gleiche getan und es funktioniert. Es schien einfach peinlich, so dass ich nach einer anderen Lösung dafür suchte. – Soner

+0

@Soner Siehe meinen aktualisierten Beitrag. –

+0

'sizeof' benötigt in diesem Fall keine Klammern! – Skizz

1

Es gibt keine Garantie, dass das eine Vergangenheit letzte Element für die cities Array NULL sein. Es kann sehr gut nicht-und sein, wird es unbeabsichtigter Speicherzugriff sein, sicher.

Also, sagen

for(i=0; *(cities+i) != NULL; i++) 

Sie versuchen, einen ungültigen Speicher zugreifen (wenn Sie von der gültigen Speicherplätze bereits ausgeführt haben), die undefined behavior aufruft.

Sie können den NULL als Sentinel-Wert festlegen, indem Sie das letzte Element der geschweiften Initialisierungsliste verwenden. Etwas wie

char *cities[] = {"Adiyaman","Kayseri","Istanbul", NULL}; //explicit NULL 
+0

Wie kann ich es tun, ohne die Größe des Arrays dann zu definieren? – Soner

+0

@Soner bereits aktualisierte Antwort. –

0

Überprüfen Sie bitte [] = { "Bangladesh" char * name will zu schreiben, "Sri Lanka", "Pakistan", "Indien", NULL};

Verwandte Themen