Rumah > pembangunan bahagian belakang > C++ > Mengapakah `c_str()` Memulangkan Sampah Apabila Digunakan Terus pada Fungsi Mengembalikan Rentetan?

Mengapakah `c_str()` Memulangkan Sampah Apabila Digunakan Terus pada Fungsi Mengembalikan Rentetan?

Linda Hamilton
Lepaskan: 2024-11-27 08:47:15
asal
690 orang telah melayarinya

Why Does `c_str()` Return Garbage When Used Directly on Function Return Strings?

Menyingkap enigma c_str() dalam rentetan pemulangan fungsi

Fungsi c_str() ialah alat yang berkuasa untuk menukar std:: objek rentetan ke dalam const char*. Walau bagaimanapun, apabila digunakan terus pada nilai pulangan fungsi yang mengembalikan rentetan, ia boleh menghasilkan hasil yang misteri.

Intipati Masalah

Pertimbangkan kod berikut coretan:

string str = SomeFunction();
const char* strConverted = str.c_str(); // strConverted stores the value of the string properly
const char* charArray= SomeFunction().c_str(); // charArray stores garbage value

static string SomeFunction()
{
    string str;
    // does some string stuff
    return str;
}
Salin selepas log masuk

Dalam senario ini, strConverted memegang nilai dengan betul daripada rentetan yang dikembalikan. Walau bagaimanapun, charArray dipenuhi dengan omong kosong. Mengapakah tingkah laku yang membingungkan ini berlaku?

Menyelidiki Sementara

Kuncinya terletak pada sifat nilai pulangan. Apabila SomeFunction() mengembalikan rentetan, rentetan itu sebenarnya objek sementara. Objek sementara mempunyai jangka hayat yang terhad, biasanya berakhir pada penghujung blok kod semasa.

Perangkap Penunjuk Berjuntai

c_str() mengembalikan penunjuk ke penimbal dalaman rentetan. Apabila dipanggil pada rentetan sementara secara langsung (cth., SomeFunction().c_str()), penuding yang dikembalikan menjadi penuding berjuntai apabila objek sementara itu hilang dengan pantas. Penunjuk berjuntai inilah yang melanda charArray dengan data yang tidak boleh dipercayai.

Penyelesaian: Memanjangkan Jangka Hayat

Untuk mengelakkan bahaya ini, adalah penting untuk memanjangkan hayat rentetan sementara. Satu pendekatan mudah adalah untuk menetapkannya kepada pembolehubah rentetan baharu, seperti yang ditunjukkan dalam contoh str_copy. Dengan berbuat demikian, objek rentetan dikekalkan, memastikan penunjuk yang sah daripada c_str().

Kesimpulannya

Apabila berurusan dengan rentetan pengembalian fungsi, berhati-hati dinasihatkan apabila menggunakan c_str() secara langsung pada nilai pulangan. Untuk mengelakkan perangkap penunjuk berjuntai, tetapkan nilai pulangan kepada pembolehubah rentetan baharu sebelum menggunakan c_str(). Ini menjamin penunjuk yang stabil kepada kandungan rentetan.

Atas ialah kandungan terperinci Mengapakah `c_str()` Memulangkan Sampah Apabila Digunakan Terus pada Fungsi Mengembalikan Rentetan?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan