В C ++ Передача массива char в супер дает ошибку? - PullRequest
0 голосов
/ 15 сентября 2010

У меня есть такая структура:

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?

Ответы [ 2 ]

6 голосов
/ 15 сентября 2010

Нет проблем с уничтожением стековой памяти. 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.

2 голосов
/ 15 сентября 2010

char toCopy [4];будет доступен и существует до конца метода doSomething.А что касается проблемы, которая у вас есть ... Как сказал Навин ... это потому, что вы не указали терминатор "NULL" ... чтобы решить эту проблему, вы можете переписать определение toCopy следующим образом: -

char toCopy[4] = {0};

Я настоятельно рекомендую вам использовать строку вместо обычного массива char ... поэтому, если мы переписываем код с новыми изменениями ... это будет так ...

 #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 !!! 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...