Comment avoir un pointeur de caractère comme paramètre de sortie pour la fonction C ++

Je suis un débutant en C ++. J’essaie d’avoir un pointeur de caractère comme paramètre de sortie pour une fonction. Mais les modifications apscopes à la fonction ne sont pas reflétées dans la fonction principale. Qu’est-ce que je fais mal?

void SetName( char *pszStr ) { char* pTemp = new char[10]; strcpy(pTemp,"Mark"); pszStr = pTemp; } int _tmain(int argc, _TCHAR* argv[]) { char* pszName = NULL; SetName( pszName ); cout<<"Name - "<<*pszName<<endl; delete pszName; return 0; } 

Votre pointeur est copié sur la stack et vous lui affectez le pointeur. Vous devez passer un pointeur à l’autre si vous voulez changer le pointeur:

 void SetName( char **pszStr ) { char* pTemp = new char[10]; strcpy(pTemp,"Mark"); *pszStr = pTemp; // assign the address of the pointer to this char pointer } int _tmain(int argc, _TCHAR* argv[]) { char* pszName = NULL; SetName( &pszName ); // pass the address of this pointer so it can change cout<<"Name - "<<*pszName< 

Cela va résoudre ton problème.


Cependant, il y a d'autres problèmes ici. Tout d'abord, vous déréférenciez votre pointeur avant d'imprimer. Ceci est incorrect, votre pointeur est un pointeur sur un tableau de caractères, vous voulez donc imprimer le tableau entier:

 cout<<"Name - "< 

Ce que vous avez maintenant imprimera simplement le premier caractère. De plus , vous devez utiliser delete [] pour supprimer un tableau:

 delete [] pszName; 

De plus gros problèmes, cependant, sont dans votre conception.

Ce code est C, pas C ++, et même alors, il n'est pas standard. Tout d’abord, la fonction que vous recherchez est main :

 int main( int argc, char * argv[] ) 

Deuxièmement, vous devriez utiliser des références au lieu de pointeurs:

 void SetName(char *& pszStr ) { char* pTemp = new char[10]; strcpy(pTemp,"Mark"); pszStr = pTemp; // this works because pxzStr *is* the pointer in main } int main( int argc, char * argv[] ) { char* pszName = NULL; SetName( pszName ); // pass the pointer into the function, using a reference cout<<"Name - "< 

En dehors de cela, il est généralement préférable de simplement renvoyer des éléments si vous le pouvez:

 char *SetName(void) { char* pTemp = new char[10]; strcpy(pTemp,"Mark"); return pTemp; } int main( int argc, char * argv[] ) { char* pszName = NULL; pszName = SetName(); // assign the pointer cout<<"Name - "< 

Il y a quelque chose qui améliore tout cela. C ++ a une classe de chaîne :

 std::ssortingng SetName(void) { return "Mark"; } int main( int argc, char * argv[] ) { std::ssortingng name; name = SetName(); // assign the pointer cout<<"Name - "<< name< 

Bien sûr, tout cela peut être simplifié, si vous voulez:

 #include  #include  std::ssortingng get_name(void) { return "Mark"; } int main(void) { std::cout << "Name - " << get_name() << std::endl; } 

Vous devriez travailler sur votre mise en forme pour rendre les choses plus lisibles. Les espaces entre vos opérateurs aident:

 cout<<"Name - "< 

Tout comme les espaces entre les mots anglais peuvent aider, les espaces sodo entre vos opérateurs. 🙂

Vous pouvez également utiliser une référence à un pointeur dans ce cas. De plus, vous voudrez peut-être connaître 2 autres bogues qui se trouvent dans le code original (voir mes commentaires dans l’extrait de code).

  void SetName( char *& pszStr ) { char* pTemp = new char[10]; strcpy(pTemp,"Mark"); pszStr = pTemp; } int _tmain(int argc, _TCHAR* argv[]) { char* pszName = NULL; SetName(pszName); // Don't need '*' in front of pszName. cout<< "Name - " << pszName << endl; // Needs '[]' to delete an array. delete[] pszName; return 0; } 

Puisque vous avez balisé en C ++, pourquoi ne pas transmettre une référence std :: ssortingng et la remplir?

 void GetName(std::ssortingng &strName) { strName = "Mark"; } 

Ou retournez simplement un std :: ssortingng:

 std::ssortingng GetName2() { return "Mark"; } 

Et appelez comme si

 std::ssortingng strName, strName2; GetName(strName); strName2 = GetName2(); assert(strName == "Mark"); assert(strName2 == "Mark"); //strName.c_str() returns the const char * pointer. 

Ensuite, vous n’avez pas à vous soucier de libérer de la mémoire.

Ce que vous écrivez n’est pas du C ++, mais du code C qui utilise new au lieu de malloc et delete au lieu de free. Si vous voulez vraiment écrire du code C ++, recommencez. Lisez un livre tel que C ++ accéléré , qui vous apprendra le C ++ idiomatique moderne.