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

  • Make:

    Make:

    23 Mart 2006
  • William Sledd

    William Sled

    24 EYLÜL 2006
  • xiaoyu85

    xiaoyu85

    20 ŞUBAT 2010