2010-09-15 35 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 !!!