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!