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; }
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!