Rumah >pembangunan bahagian belakang >C++ >Mengapa sizeof() Berkelakuan Berbeza Apabila Menghantar Tatasusunan kepada Fungsi dalam C ?

Mengapa sizeof() Berkelakuan Berbeza Apabila Menghantar Tatasusunan kepada Fungsi dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-11-11 17:56:031064semak imbas

Why Does sizeof() Behave Differently When Passing Arrays to Functions in C  ?

sizeof() Anomali Apabila Menghantar Tatasusunan ke Fungsi dalam C

Dalam C , operator sizeof() bertindak secara berbeza apabila ia melibatkan tatasusunan dihantar ke fungsi daripada apabila ia digunakan dalam fungsi utama. Percanggahan ini boleh mengelirukan bagi pemula.

Harian Tatasusunan yang Betul

Untuk menghantar tatasusunan dengan betul kepada fungsi, adalah penting untuk menghantarnya melalui rujukan, menggunakan sintaks:

int length_of_array(int (&arr)[N]);

Di mana:

  • arr ialah tatasusunan yang dihantar ke fungsi.
  • N ialah pemalar integer yang mewakili saiz daripada tatasusunan.

Menggunakan Sizeof() dalam Fungsi

Apabila menggunakan sizeof() dalam fungsi, perkara berikut adalah benar:

sizeof(arr) == N * sizeof(int);

Penjelasan:

  • sizeof(arr) mengembalikan jumlah saiz memori yang diperuntukkan kepada tatasusunan, iaitu N kali saiz setiap elemen (sizeof(int)) .

Masalah dengan Hantaran Tatasusunan yang Salah

Dalam coretan kod yang disediakan, fungsi length_of_array() secara tidak sengaja melepasi tatasusunan melalui penuding, seperti ini:

int length_of_array(int some_list[]);

Kaedah hantaran yang salah ini menyebabkan isu berikut:

  • sizeof(some_list) mengembalikan saiz penuding kepada elemen pertama dalam tatasusunan.
  • sizeof(*some_list) mengembalikan saiz elemen tunggal dalam tatasusunan.
  • Pembahagian nilai ini sentiasa menghasilkan 1, tanpa mengira saiz tatasusunan sebenar.

Penyelesaian Menggunakan Templat

Untuk mengatasi had ini, seseorang boleh menggunakan pendekatan berasaskan templat seperti ini:

template<size_t N>
int length_of_array(int (&amp;arr)[N])
{
    std::cout << N << std::endl; // Will output the correct array size
    return N;
}

Isi Utama:

Perbezaan penting antara kedua-dua kaedah terletak pada menghantar tatasusunan melalui rujukan berbanding menghantarnya melalui penuding. Yang pertama mengekalkan pengetahuan tentang saiz tatasusunan, manakala yang kedua tidak.

Atas ialah kandungan terperinci Mengapa sizeof() Berkelakuan Berbeza Apabila Menghantar Tatasusunan kepada Fungsi dalam C ?. 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