Rumah >pembangunan bahagian belakang >C++ >Mengapa Menetapkan `stringstream.str().c_str()` kepada `const char*` Membawa kepada Output Sampah?

Mengapa Menetapkan `stringstream.str().c_str()` kepada `const char*` Membawa kepada Output Sampah?

Barbara Streisand
Barbara Streisandasal
2024-11-16 17:16:03515semak imbas

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

String rentetan, rentetan dan char* Kekeliruan Penukaran

Artikel ini menangani isu menugaskan const char* kepada rentetan yang dikembalikan oleh stringstream .str().c_str().

Penjelasan Masalah

stringstream.str() membina objek rentetan sementara yang dimusnahkan pada penghujung ungkapan. Apabila menetapkan rentetan sementara ini kepada const char*, penuding merujuk rentetan yang dipadamkan, menghasilkan output sampah.

Berikut ialah contoh:

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();

Dalam kod di atas, selepas ungkapan berakhir, rentetan sementara yang dibuat oleh stringstream.str() dipadamkan, menyebabkan cstr menghala ke lokasi memori yang tidak sah.

Penyelesaian

Untuk membetulkan isu ini, rentetan sementara hendaklah disalin ke objek rentetan lain sebelum menukarnya kepada const char*. Ini boleh dicapai menggunakan pendekatan berikut:

string tmp = stringstream.str();
const char* cstr = tmp.c_str();

Penjelasan Mata Bonus

Kod yang diubah suai berikut mencetak rentetan dengan betul:

cout << cstr << ss.str().c_str() << cstr2;

Pengubahsuaian ini berfungsi kerana:

  • cstr menunjuk ke const char* yang dicipta daripada objek rentetan dengan jangka hayat yang diketahui.
  • ss.str().c_str() kembali const char* yang menunjuk kepada rentetan sementara, yang kini dilindungi oleh rujukan const yang dikembalikan oleh stringstream.str()
  • cstr2 menunjuk ke rentetan sementara yang sama seperti ss.str().c_str(), tetapi ia bukan const, jadi ia boleh diberikan kepada char* sementara yang dimusnahkan pada penghujung pernyataan cout.

Atas ialah kandungan terperinci Mengapa Menetapkan `stringstream.str().c_str()` kepada `const char*` Membawa kepada Output Sampah?. 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