Pemulangan Tatasusunan Tempatan: Memahami dan Mengelakkan Amaran dalam C
Pertimbangkan coretan kod berikut:
char *recvmsg(){ char buffer[1024]; return buffer; } int main(){ char *reply = recvmsg(); ..... }
Ini kod bertujuan untuk mendapatkan tatasusunan char melalui fungsi recvmsg(). Walau bagaimanapun, ia mencetuskan amaran:
warning C4172: returning address of local variable or temporary
Amaran ini menunjukkan bahawa pulangan daripada recvmsg() ialah alamat pembolehubah setempat, yang tidak sesuai kerana hayat pembolehubah itu tamat apabila fungsi keluar.
Penyelesaian: std::vector
Untuk menangani isu ini, pendekatan yang lebih baik ialah gunakan bekas perpustakaan standard, seperti std::vector
Kod yang dikemas kini menggunakan std::vector kelihatan seperti ini:
std::vector<char> recvmsg() { std::vector<char> buffer(1024); //.. return buffer; } int main() { std::vector<char> reply = recvmsg(); }
Mengakses Data Char:
Jika anda perlu mengakses data char mentah daripada vektor, anda boleh gunakan:
void f(const char* data, size_t size) {} f(&reply[0], reply.size());
Kaedah ini membolehkan anda menyepadukan vektor dengan lancar dengan C API atau C API yang mengharapkan char*.
Mengelakkan baharu:
Secara umumnya disyorkan untuk meminimumkan penggunaan baharu dalam C . Dengan bergantung pada bekas seperti std::vector, anda mengelakkan keperluan untuk pengurusan memori manual, mengurangkan potensi kebocoran memori dan meningkatkan kebolehselenggaraan kod.
Atas ialah kandungan terperinci Mengapa Mengembalikan Tatasusunan Tempatan dalam C Menjana Amaran, dan Bagaimana Saya Boleh Membetulkannya Menggunakan `std::vector`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!