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

DDD
Lepaskan: 2024-10-29 20:34:29
asal
601 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!