2016-04-13 7 views
0
#include<iostream> 
using namespace std; 
class String { 
public: 
char *q; 
int len; 
String() { q = new char[0]; } 
String(char * p) { 
    for (int i = 0;*p!=00; i++) { 
     len++; 
     p++; 
    } 
    q = new char[len]; 
    for (int i = 0; i < len; i++) { 
     *q = *p; 
     p++; q++; 
    } 
    for (int i = 0; i < len; i++) { 
     cout << *q; 
     q++; 
    } 
} 

}; 
void main() { 
String s1; 
String s2("My name is navdeep."); 
system("PAUSE"); 
}  

enter image description herei len artırılır ediliyor döngü içinde cout dahil denedi garip çıktılı

alıyorum. sonuç iyi. ama kopyalama sırasında bir şeyler ters gidiyor.

+0

* Dizi sonlandırıcıyı * unutuyor gibi görünüyorsunuz. –

+0

Dahili 'String' arabelleğinde' \ 0 'karakterini sonlandırmayı düşünmeniz gerekir. –

cevap

0

bir süre bu satırları dikkate sağlar.

Ardından, ilk döngüde ,q'u değiştirin. ve döngünün sonunda artık orijinal yere işaret etmeyecek, işaretçi size new[] ifadesini verecektir. Aslında, q, ayrılmamış belleğe işaret edecektir.

Belleği yazdırmaya devam edersiniz, ancak artık sınırlar dışındasınız ve belirsiz verileri yazdırarak tanımlanmamış davranışı. Sen döngüler

başlangıçta q aynı değere başlatıldı geçici değişken üzerinde çalışması gerekiyor. Ve bu geçici işaretçiyi döngüler arasında sıfırlamanız gerekir.

1

İşaretçileri sıfırlamıyorsunuz. p ve q, her döngüden önce dizilerin başlangıcını göstermelidir.

q = new char[len]; 
for (int i = 0; i < len; i++) { 
    *q = *p; 
    p++; q++; 
} 
for (int i = 0; i < len; i++) { 
    cout << *q; 
    q++; 
} 

Önce sen bellek ve q atamak:

İlgili konular