2010-09-15 34 views
0

我有這樣的結構:在C++中,將char數組傳遞給超級錯誤?

class Base 
{ 
public: 
    void doACopy(char* strToCopy) { 
     strcpy(str, strToCopy); 
    } 
private: 
    char str[4]; 
}; 

class Derived : public Base 
{ 
public: 
    void doSomething() { 
     char toCopy[4]; 
     toCopy[0] = 'a'; toCopy[1] = 'b'; toCopy[2] = 'c'; 
     Base::doACopy(toCopy); // is there any problem passing toCopy here? 
    } 
}; 

我知道toCopy是在堆棧中分配。在將這個數組傳遞給super時有任何問題,在這種情況下是Derived :: doACopy?

+5

你可能更容易使用'std :: string'。 – GManNickG 2010-09-15 04:30:21

回答

6

堆棧內存被破壞沒有問題。 toCopy有效,直到doSomething返回,到那時strcpy完成。

但它們必須是長度爲4,你必須NUL,終止toCopy

private: 
    char str[4]; 

// ... 
char toCopy[4]; 
toCopy[0] = 'a'; toCopy[1] = 'b'; toCopy[2] = 'c'; 
toCopy[3] = '\0'; 

原樣,沒有NUL終止符(甚至室),並在strcpy這會導致緩衝區溢出。

+0

所以我遇到的問題不是因爲堆棧的東西是因爲這個NULL終止符。 – okami 2010-09-15 04:25:10

+2

很可能,strcpy會將字符複製到它所找到的第一個NULL。如果您不提供終止符,它將繼續前進,直到找到內存中的一個。 Google'緩衝區溢出'或'緩衝區溢出'。 – Blastfurnace 2010-09-15 04:32:36

2

char toCopy [4];將可用並存在,直到方法doSomething結束。關於你有的問題......正如Naveen所說......這是因爲你沒有把終止符char「NULL」......爲了解決這個問題,你可能會重寫toCopy的定義如下: -

char toCopy[4] = {0}; 

我強烈建議你使用字符串,而不是字符的普通數組......所以,如果我們重寫了新的變化的代碼......它會是這樣......

#include<string> 
using std::string; 

class Base 
{ 
public: 
    void doACopy(string & strToCopy) { 
     str = strToCopy; 
    } 
private: 
    string str; 
}; 

class Derived : public Base 
{ 
public: 
    void doSomething() { 
     string toCopy = "abc"; 
     Base::doACopy(toCopy); // is there any problem passing toCopy here? 
    } 
}; 

is not easy !!!