SORU
24 HAZİRAN 2015, ÇARŞAMBA


Neden diğerleri üzerinde bazı platformlarda döngü çıkmak için değil, bu mu?

Yakın zamanda C öğrenmeye başladım ve konu olarak C sınıfı alıyorum. Şu anda etrafında döngüler ile oynuyorum ve açıklamak için nasıl bilmiyorum, bazı garip davranışlar içine koşuyorum.

#include <stdio.h>

int main()
{
  int array[10],i;

  for (i = 0; i <=10 ; i  )
  {
    array[i]=0; /*code should never terminate*/
    printf("test \n");

  }
  printf("%d \n", sizeof(array)/sizeof(int));
  return 0;
}

Dizüstü bilgisayarımda Ubuntu 14.04, bu çalışan kod sonu değil. Sonuna kadar çalışır. Benim okulun bilgisayar üzerinde çalışan Otomotiv-6.6, aynı zamanda iyi çalışır. Windows döngü asla sona erer 8.1,.

Daha da garip olan şey ben döngü durumuna düzenlerken ...ben&;=11... kod sadece benim laptop üzerinde çalışan sona erer lt Ubuntu. Hiç Otomotiv ve Windows sonlandırır.

Herkesin hafızasında olanları ve farklı İşletim sistemleri için aynı kod çalışan farklı sonuçlar verir neden açıklayabilir mi?

EDİT: döngü sınırları dışına gider biliyorum. Bilerek yapıyorum. Ben sadece davranışları farklı İşletim sistemleri ve bilgisayarlar arasında farklı olabilir nasıl anlamaya olamaz.

CEVAP
24 HAZİRAN 2015, ÇARŞAMBA


Dizüstü bilgisayarımda Ubuntu 14.04, bu kodu çalıştırmadan sonuna kadar çalışır sonu değil. Benim okulun bilgisayar üzerinde çalışan Otomotiv-6.6, aynı zamanda iyi çalışır. Windows döngü asla sona erer 8.1,.

Daha fazla ne gariptir ki ben döngü için Koşullu bir ...... düzenleme&;=11 ... kod sadece benim laptop ne zaman sona erer lt Ubuntu çalışıyor. Otomotiv ve Windows hiçbir zaman sona erdirir.

Sadece bellek stomping keşfettim. Bu konuda daha fazla buradan okuyabilirsiniz: What is a “memory stomp”?

int array[10],i;, ayrılamadı, bu değişkenler bellekte (özellikle, bellek bloğu işlevi ile ilişkili olan yığını, üzerine gönderildiler). [] bir dizi ve büyük ihtimalle bellekte birbirine bitişik. Windows 8.1, dizi[10] yer almaktadır. Otomotiv, dizi[11] ' de bulunmaktadır. Ve Ubuntu ne durumda (belki dizi[-1]?).

Kodunuzu hata ayıklama bu ifadeler eklemeyi deneyin. Yineleme 10 fark veya 11, dizi[i] ben işaret ediyor.

#include <stdio.h>

int main() 
{ 
  int array[10],i; 

  printf ("array: %p, &i: %p\n", array, &i); 
  printf ("i is offset %d from array\n", &i - array);

  for (i = 0; i <=11 ; i  ) 
  { 
    printf ("%d: Writing 0 to address %p\n", i, &array[i]); 
    array[i]=0; /*code should never terminate*/ 
  } 
  return 0; 
} 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • RiceBunny

    RiceBunny

    16 ŞUBAT 2006
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013