2016-04-13 50 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 here嘗試通過constructor.I初始化String類的我越來越怪異輸出

爲什麼發生這種情況我不knnow,我已經嘗試包括在COUT for循環,其中LEN正在增加。那裏的結果是好的。但複製時出現問題。

+0

您似乎忘記了*字符串終止符*。 –

+0

你需要考慮在你的內部字符串緩衝區中有一個終止的'\ 0'字符。 –

回答

0

讓我們考慮這些行了一會兒:

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++; 
} 

首先,你分配內存並將其分配給q

然後在第一個循環中你修改q。並且在循環結束時它將不再指向原始位置,指針會通過new[]表達式給予您。實際上,q將指向未分配的內存。

然後您繼續打印出內存,但是現在您已超出範圍並將打印出不確定的數據,從而導致未定義的行爲

您需要循環工作臨時變量,最初初始化爲與q相同的值。您需要重置循環之間的臨時指針。

1

您不重置指針。在每個循環之前,p和q應該指向數組的開始。