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

Barbara Streisand
Lepaskan: 2024-11-16 17:16:03
asal
464 orang telah melayarinya

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

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

Penjelasan Mata Bonus

Kod yang diubah suai berikut mencetak rentetan dengan betul:

cout << cstr << ss.str().c_str() << cstr2;
Salin selepas log masuk

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!

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