2017-12-16 135 views
10

şimdilik Byarne Stroustrup tarafından yazılmış "C++ turu" diyorum. Önemli olan şey:Nullptr düzgün bir şekilde nasıl kullanılır?

int count_x(char* p, char x) 
// count the number of occurrences of x in p[] 
// p is assumed to point to a zero-terminated array of char (or to nothing) 
{ 

    if (p == nullptr) return 0; 
     int count = 0; 

    for (; p != nullptr; ++p) 
     if (*p == x) 
      ++count; 

    return count; 
} 

benim benim ana olarak: Ben programı çalıştırdığınızda

int main(){ 

    char* str = "Good morning!"; 
    char c = 'o'; 
    std::cout << count_x(str, c) << std::endl; 

    return 0; 
} 

o I çöküyor "işaretçiler, diziler ve referanslar" konulu aynen şöyle nullptr kullanmayla ilgili bir örnek verdi

: Ben böyle olmasını döngü değiştirirseniz bir istisna hattı

if (*p == x) 

atılan olsun

Artık her şey yolunda gidiyor! MSVC++ 14.0 kullanıyorum.

  • ben bir istisna alamadım ideone koştu ancak sonuç 3 olması gereken hep 0 aynı kodu:

https://ideone.com/X9BeVx

+1

@DeiDei: Evet, yalnızca kodu kopyalayıp yapıştırdım. Eklediğim ana kod. – WonFeiHong

+1

@DeiDei: Bu nasıl doğru olmalı: '* p! = Nullptr'? sanırım 'nullptr' sadece adresler için işaretçiler, işaret ettikleri adrese değmedikleri bir değere işaret ederler. – WonFeiHong

+5

Bunu errata'nın hiçbirinde "C++ turu" için bulamadım. Bjarne'a yazmalı ve ona haber vermelisin. Bu bir hata. – StoryTeller

cevap

14

p != nullptr ve *p çok farklı kontrolleri gerçekleştirin.

Eski, işaretçinin kendisinin boş olmayan bir adres içerdiğini kontrol eder. İkincisi, işaret edilen adresin 0 olmayan bir şey içerdiğini kontrol ederken, diğeri ise arabellek içeriğinin işaretlendiği döngüde açıkça uygundur.

Ara belleği okumaya son vermediğiniz için segfault sizsiniz (geçerli bir işaretçi art arda üretildiğinde null üretmez). Böylece, tampon sınırınızın ötesine erişme yoluna girersiniz.

+1

Ancak bu yanlış kabul edilir: '* p = nullptr' değil mi? – WonFeiHong

+3

@WonFeiHong - Evet, bu yanlış olur. '* p' bir işaretçi türüne sahip değildir, bu yüzden 'nullptr' ile karşılaştırmak mümkün olmayacaktır. – StoryTeller

+1

denediğinizde bir derleyici hatası alacaksınız. Eğer daha açık bir karşılaştırma yapmak istiyorsanız, * p! = '\ 0' yapabilirsiniz, ancak sadece * p iyi çalışıyor ... –

0

C dili özelliğini kullandığınızı unutmayın.

Sorununuz, for döngünüzde. İşaretçi karakter dizisinin son öğesine ulaştıktan sonra karakter dizisi nullptr dizinin sonuna işaret eder.

Eğer ptr puan '\0' ve senin for siz aşağıya kodunu değiştirmek gerekir olduğunu için gibi const char *a ="world" ve ptr puan

 +-----+  +---+---+---+---+---+---+ 
ptr :| *======> | w | o | r | l | d |\0 | 
    +-----+  +---+---+---+---+---+---+ 

son öğe bir karakter dizisi var düşünün:


for (; *p != 0; p++) { 
     if (*p == x) 
      ++count; 
    } 

çıkışı: 3

+0

@ hnefatl- Ne bekliyorsunuz? yapmam mı –