Maison >développement back-end >C++ >Pourquoi tenter de convertir char en wchar_t avec mbstowcs() conduit-il à des résultats inattendus ?

Pourquoi tenter de convertir char en wchar_t avec mbstowcs() conduit-il à des résultats inattendus ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 07:56:30523parcourir

Why Does Attempting to Convert char to wchar_t with mbstowcs() Lead to Unexpected Results?

Comment convertir correctement char en wchar_t pour l'intégration Unicode

Conversion de char chaînes en wchar_t est essentiel pour intégrer des chaînes de caractères normales dans les applications Unicode. Une approche courante consiste à utiliser la fonction mbstowcs().

Tentative originale :

Le code suivant peut sembler une implémentation simple mais donne malheureusement des résultats inattendus :

<code class="c++">const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t wc[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}</code>

Approfondir :

Le problème réside dans la déclaration de wc en tant que variable locale. Au retour de la fonction, wc devient désalloué, laissant la fonction avec un pointeur pointant vers la mémoire inutile.

Solution :

Pour résoudre ce problème, nous allouons dynamiquement la mémoire pour wc et renvoyez-lui un pointeur. Le code modifié ci-dessous le démontre :

<code class="c++">const wchar_t *GetWC(const char *c)
{
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
}</code>

Attention :

Il est crucial de noter que le code appelant est désormais responsable de la désallocation de la mémoire allouée dynamiquement pour empêcher la mémoire fuites.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn