2010-09-15 19 views
0

J'ai cette structure:En C++, Passant char array à super donner des erreurs?

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

Je sais que toCopy est alloué sur la pile. Y at-il un problème à passer ce tableau à super, dans ce cas Derived :: doACopy?

+5

vous deviendriez probablement avoir un temps plus facile en utilisant 'std :: string'. – GManNickG

Répondre

6

La pile de mémoire en cours de destruction ne pose aucun problème. toCopy est valide jusqu'au doSomething renvoie, et à ce moment le strcpy est terminé.

Mais ils doivent être à la fois une longueur de 4, et vous devez NUL-fin toCopy:

private: 
    char str[4]; 

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

Comme il est, il n'y a pas terminateur NUL (ou même chambre), et cela va causer un débordement de mémoire tampon pendant strcpy .

+0

donc le problème que je suis n'est pas parce que la pile est à cause de ce terminateur NULL. – okami

+2

Probablement, strcpy va copier les caractères jusqu'à et y compris la première NULL qu'il trouve. Si vous ne fournissez pas le terminateur, il continuera jusqu'à ce qu'il en trouve un en mémoire. Google 'buffer overflow', ou' buffer overrun'. – Blastfurnace

2

char à Copie [4]; sera disponible et existera jusqu'à la fin de la méthode doSomething. Et concernant le problème que vous avez ... Comme Naveen l'a dit ... c'est parce que vous n'avez pas mis un caractère de fin "NULL" ... pour résoudre ce problème, vous pouvez réécrire la définition de toCopy comme suit: -

char toCopy[4] = {0}; 

Je vous recommande fortement d'utiliser la chaîne au lieu de simple tableau de charbon ... donc si nous réécrivons le code avec de nouveaux changements ... ce sera comme ça ...

#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 !!!