2016-04-03 11 views
-2

const char* döndüren bir işlev var.cpp-sadece c_str() değerini nasıl alacağınız()

string str; 

I str.c_str() kullanmak const char* için str dönüştürmek için: Bu işlevde Aşağıdaki params sahiptir. Hata ayıkladığımda, str.c_str() dizesinin değerinden önce bir şey içerdiğini (adresini tahmin ediyorum) dikkatimi çekiyorum. Örneğin: str = "0" I str.c_str() 0x68d5f9 "0". Neden? Yalnızca dizenin değerini nasıl alabilirim?

+0

olarak size aynı verecektir. İşaretçinin işaret ettiği adresi yazdırır, sonra "0" işaretli dizeyi görüntüler. – erenon

+1

bir işlevdir, 'str.c_str() ' –

+0

@ erenon-' dediğimde tam olarak söylediğim şey. – sara8

cevap

0

c_str tarafından döndürülen dizede işaretçi tarafından gösterilen adresi alamazsınız. Programcıların değeri ile birlikte adresi incelemesi için tasarlanmış bir hata ayıklayıcı eseridir. Ancak, c_str sonucunu döndürme, arama işlevli bir dizede yapılırsa, tanımlanmamış davranış olabilir.

Örneğin, bu yasa dışıdır:

const char *illegal_return() { 
    string s = "quick brown fox"; 
    return s.c_str(); // <<== Return of c_str from a local string 
} 

iyi düzeltme bir string döndürmektir. Bunun yerine bir char işaretçi dönmek istiyorum, bir kopyasını yapmak gerekir:

char *legal_return() { 
    string s = "quick brown fox"; 
    const char *ptr = s.c_str(); 
    size_t len = strlen(ptr); 
    char *res = new char[len+1]; 
    strcpy(res, ptr); 
    return res; 
} 

yukarıdaki fonksiyonun arayan bellek sızıntılarını önlemek için sonuca delete[] çağırmalıdır.

1

Bu bir bir sorun değil, bu nasıl işaretçiler çalışır. verilere

işaretçiler noktası az bellek adresini içerir ve hata, bu işaretçi noktaları 0x<something> yönelik olduğunu gösterir ve bu adreste değeri '0' olup. Burada garip bir şey yok.

str.c_str()'dan aldığınız bu değeri yazdırdığınızda, sıradan bir C dizesi alırsınız.

cout << str.c_str(); 

Bu Yanlış ayıklayıcı çıkışını okuduğunuz cout << str;

İlgili konular