Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Penukaran Array char kepada wchar_t Menghasilkan Gelagat Tidak Ditakrifkan dalam Kod Ini?

Mengapakah Penukaran Array char kepada wchar_t Menghasilkan Gelagat Tidak Ditakrifkan dalam Kod Ini?

DDD
DDDasal
2024-10-29 20:34:29601semak imbas

Why Does Converting a char Array to wchar_t Result in Undefined Behavior in This Code?

Tukar char kepada wchar_t: Meneroka Penyelesaian dan Menyelesaikan Ralat Fungsi

Menukar tatasusunan aksara (char ) kepada tatasusunan aksara yang luas (wchar_t) ialah tugas biasa dalam pengaturcaraan UNICODE. Walaupun pelbagai pendekatan wujud, kami akan menumpukan pada pelaksanaan khusus yang menghadapi isu.

Coretan kod yang dibentangkan:

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

bertujuan untuk melaksanakan penukaran dengan memperuntukkan wchar_t setempat penimbal, wc, dengan saiz yang sama dengan rentetan aksara input. Walau bagaimanapun, pendekatan ini tidak berfungsi seperti yang diharapkan.

Isu ini berpunca daripada fakta bahawa wc diisytiharkan sebagai pembolehubah tempatan dalam fungsi. Apabila panggilan fungsi tamat, memori yang diperuntukkan untuk wc akan diagihkan, mengakibatkan tingkah laku tidak ditentukan.

Untuk menyelesaikan masalah ini, kita mesti memastikan bahawa penimbal wchar_t yang diperuntukkan kekal melebihi jangka hayat fungsi. Pembetulan yang sesuai ialah:

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

Dengan memperuntukkan penimbal wchar_t menggunakan baharu, kami menyimpan memori pada timbunan yang tidak akan diagihkan apabila fungsi itu kembali. Walau bagaimanapun, tanggungjawab untuk menyamakan kedudukan memori ini kini terletak pada kod panggilan untuk mengelakkan kebocoran memori.

Atas ialah kandungan terperinci Mengapakah Penukaran Array char kepada wchar_t Menghasilkan Gelagat Tidak Ditakrifkan dalam Kod Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn