2009-06-28 376 views
2

我在寫一個簡單的程序。它只有一個類。有一個私人成員'char * number'和兩個函數(會有更多,但首先這些應該正常工作:))。在C++中打印char *

第一個應該複製的「源」到「數字」變量(和我想的地方現在的問題):

LongNumber::LongNumber(const char * source){ 
     int digits = strlen(source); 

     char* number = new char[digits+1]; 
     strcpy(number, source); 
     // cout<<number<<endl; - if the line is uncommented, 
     // the output is correct and there isn't a problem 

} 

和打印功能:

void LongNumber::print(){ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

當然,我錯過了一些東西......但是什麼?

(由於這是我的第一篇......你認爲標籤corrected..how將您所標記的職位?)

預先感謝您:)

回答

5

LongNumber構造你聲明一個名爲number一個新的局部變量,並用新char數組初始化:

char* number = new char[digits+1]; 

相反,你應該離開了char*,所以它看起來並不像一個新的變量聲明並使用對象的成員變量:

number = new char[digits+1]; 

在當前的代碼,所述成員變量number永遠不會被初始化,並在以後使用它在print導致一個錯誤。

6

您的編號char *數組在退出構造函數時會超出範圍。當到達print()時,由於程序不再訪問* number最初指向的內存,它將崩潰(即分段錯誤)。爲了解決這個問題,而是執行此操作:

class LongNumber 
{ 
    char *number; 
    LongNumber(const char *source); 
    ~LongNumber(); 
    void print(); 
}; 

LongNumber::LongNumber(const char * source){ 
     int digits = strlen(source); 

     number = new char[digits+1]; 
     strcpy(number, source);  
} 

void LongNumber::print(){ 
    cout<<number<<endl; 
} 

不要忘記做到以下幾點:

LongNumber::~LongNumber() 
{ 
    delete [] number; // to avoid memory leaks 
} 

我也強烈建議使用STL ::字符串,而不是使用char *您*號變量,因爲您不必自己處理內存管理開銷,並且複製字符串也會更容易。

1

你的問題是在構造函數:

LongNumber::LongNumber(const char * source) 
{ 
    ... 
    // you are declaring a new local variable called `number` here 
    char* number = new char[digits+1]; 
    strcpy(number, source); 
    ... 
} 

你沒有複製到被稱爲number類的成員變量,您聲明在構造函數體新的本地變量和使用。類成員變量未使用,可能未定義。對於一個指針成員,這意味着該值可以是任何無效值 - 那麼當你調用打印:

void LongNumber::print() 
{ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

number您使用這裏,是類成員變量,正如我們所說的是不確定的。因爲它試圖使用該無效指針,所以調用cout將會崩潰。

解決方法是使構造函數中使用正確的類成員變量:

LongNumber::LongNumber(const char * source) 
{ 
    ... 
    // use the class member variable `number` here 
    number = new char[digits+1]; 
    strcpy(number, source); 
    ... 
} 
1

它看起來對我來說,你的聲明號碼作爲一個局部變量。如果你希望能夠到另一個函數中再次調用它,你必須聲明它的類定義......像這樣:

class LongNumber{ 
public: 
     int digits; 
     char* number; 
     LongNumber(const char * source); 
     void print(); 
} 

LongNumber::LongNumber(const char * source){ 
     digits = strlen(source); 
     number = new char[digits+1]; 
     strcpy(number, source); 
     // cout<<number<<endl; - if the line is uncommented, 
     // the output is correct and there isn't a problem 
} 

void LongNumber::print(){ 
    cout<<number<<endl; 
    // when I try to print with the same line of code here..it crashes 
} 

希望幫助!

+0

哎呀,似乎有一百萬人回答了這個問題,而我......對不起,關於這個:) – micmoo 2009-06-28 07:30:45