SORU
6 AĞUSTOS 2009, PERŞEMBE


C Erişen bir Dizi sınırları dışında hiçbir hata veriyor, neden?

Sınırları dışında bir C programında değerleri bu şekilde atıyorum:

#include <iostream>
using namespace std;
int main()
{
    int array[2];
    array[0] = 1;
    array[1] = 2;
    array[3] = 3;
    array[4] = 4;
    cout << array[3] << endl;
    cout << array[4] << endl;
    return 0;
}

Program 3 4 yazdırır. Mümkün değil. G 4.3.3 kullanıyorum

Burada derlemek ve çalıştırmak komut

$ g   -W -Wall errorRange.cpp -o errorRange
$ ./errorRange
3
4

Sadece array[3000]=3000 bana bölümleme hatası ver atama yapar.

Gcc bakmıyor dizi sınırları kontrol olursa, nasıl olursa benim program bazı ciddi sorunlar daha sonra neden olabilir gibi doğru, emin olabilirim?

Yukarıdaki kod ile değiştirdim

vector<int> vint(2);
vint[0] = 0;
vint[1] = 1;
vint[2] = 2;
vint[5] = 5;
cout << vint[2] << endl;
cout << vint[5] << endl;

ve bu da herhangi bir hata üretir.

Çözüm: mümkün olduğunda std kaplar ham diziler yerine kullanmak, ve [] yerine .at() kullanmak için doğru, iyi davranış tanımlanmış.

CEVAP
6 AĞUSTOS 2009, PERŞEMBE


C/C programcıları her en iyi dost: Tanımsız Davranış.

Dil standart, çeşitli nedenlerle tarafından belirtilen olmayan bir çok şey var. Bu da onlardan biri.

Tanımsız davranış karşılaşma, her ne zaman genel olarakhiçbir şeyolabilir. Uygulama, dondurabilir, CD-ROM sürücü çıkarma veya şeytanlar burnundan çıkacak yapabilir çökebilir. Sizin sabit disk biçimi olabilir ya da büyükannen tüm porno e-posta.

Eğer gerçekten şanssız iseniz, olabilir bilegörünürdüzgün çalışması için.

Dil sadece ne öğeleri erişmek olması gerektiğini söylüyoriçindedizi sınırları. Eğer çizginin dışına çıkarsan ne olur, tanımsız bırakılmıştır. Olabilirgibi görünüyorbugün işe, derleyici, ama yasal C veya C değil , ve hala programı çalıştırmak sonraki zaman işe yarayacağının garantisi yok. Üzerine veya temel veri şu anda bile geçmediğini ve sadece sorunlara değilbuhenüz neden olacak.

Olarak içinnedensınırları kontrol yok, cevap için bir kaç yönü vardır:

  • Bir dizi dizi olsun en az senin kadar ilkel C. C Bir artık. Bitişik adresleri ile elementlerden sadece bir dizi. Sınırları sadece ham bellek teşhir çünkü kontrol yok. Sınır denetimi sağlam bir mekanizma uygulamak C. neredeyse imkansız olurdu
  • C , sınır denetimi sınıf türleri mümkündür. Ama hala düz eski bir dizi C-uyumlu bir. bir sınıf değildir. Ayrıca, C ayrıca sınır denetimi olmayan ideal kılan başka bir kural üzerine inşa edilmiştir. C temel ilke, "kullanmadığınız ne için para vermene gerek yok". Eğer kod doğru ise, sınır denetimi ihtiyacın yok, ve sınır denetimi çalışma yükü için ödemek zorunda olmamalısın.
  • C de sağlar std::vector sınıf şablonu sunuyor. operator[] verimli olması için tasarlanmıştır. Dil standart kontrol de korusun olmasa da () sınırları gerçekleştiren gerektirmez. Bir vektör de at() üye işlevi vardırgarantilisınır denetimi gerçekleştirmek için. C , eğer bir vektör kullanırsanız, her iki dünyanın en iyisi olsun. Dizi gibi sınır denetimi olmadan yüksek performans elde edebilirsinizveistediğiniz zaman sınırları-Kontrol erişim ve kullanma yeteneği.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • iBand IguJoo

    iBand IguJoo

    25 AĞUSTOS 2006
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011