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

Barbara Streisand
Lepaskan: 2024-11-11 17:56:03
asal
998 orang telah melayarinya

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

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

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

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

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!

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