2016-03-27 15 views
2

Neden bu, derlendikten sonra çalışmayı durdurdu. Çıkışı doğru bir şekilde verir ancak hemen ardından bozulur.İşaretçi dizileri, çalışmayı durdurdu

#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; 
} 

cevap

1

gibi bir şey dizi dizi NULL eşittir bir öğe olmadığı için

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

Aksi döngü çalışmaz şu şekilde tanımlayın.

döngü şu şekilde

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

     puts(cities[i]); 

    } 

Yoksa işaretçileri kullanmak istiyorsanız o zaman

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

     puts(*p); 

    } 
+0

Evet, aynısını yaptım ve işe yarıyor. Sadece garip görünüyordu, bunun için başka bir çözüm aradım. – Soner

+0

@Soner Güncellenmiş gönderime bakın. –

+0

'sizeof' bu durumda parantez gerektirmez! – Skizz

1

bir geçmiş son öğe cities dizisi için NULL olacağı garantisi yoktur. Pek iyi değil-NULL ve kesinlikle istenmeyen bellek erişimi olacaktır. Eğer undefined behavior çağırır (zaten geçerli hafıza yerlerinin arasında yayınlanmış olan) geçersiz bellek erişmeye çalışıyorsanız

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

söyleyerek Yani

.

Bağlantılı kapanış başlatıcı listesinin son öğesini yaparak, NULL'i sentinel değeri olarak yapmak isteyebilirsiniz.

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

Dizinin boyutunu tanımlamadan nasıl yapabilirim? – Soner

+0

@Soner zaten güncellenmiş bir cevap. –

0

* ad [] = { "Bangladeş" Sözc'ü kontrol edin yazmak için kolay olurdu, "Srilanka", "Pakistan", "Hindistan", NULL};

İlgili konular