Rumah > pembangunan bahagian belakang > C++ > Mengapakah `sizeof()` Mengembalikan Nilai Berbeza untuk Tatasusunan Dalam dan Luar Fungsi dalam C?

Mengapakah `sizeof()` Mengembalikan Nilai Berbeza untuk Tatasusunan Dalam dan Luar Fungsi dalam C?

Barbara Streisand
Lepaskan: 2024-12-21 18:35:09
asal
893 orang telah melayarinya

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in C?

Mengapa Menghantar Tatasusunan kepada Fungsi Mengubah Nilai saiz()nya

Dalam pengaturcaraan C, menghantar tatasusunan kepada fungsi boleh membawa kepada tingkah laku yang tidak dijangka mengenai saiznya apabila mendapatkannya menggunakan sizeof(). Keanehan ini timbul disebabkan oleh konsep pereputan tatasusunan.

Reput Tatasusunan Dijelaskan

Apabila tatasusunan dihantar kepada fungsi, ia secara tersirat ditukar atau "mereput" menjadi penunjuk kepada elemen pertamanya. Penukaran ini secara berkesan menyembunyikan saiz sebenar tatasusunan, kerana sizeof() kini beroperasi pada penuding berbanding tatasusunan asal.

Contoh dengan Kod

Pertimbangkan coretan kod berikut :

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (incorrect)
}

int main(int argc, const char * argv[]) {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct)

    test(point);

    return 0;
}
Salin selepas log masuk

Dalam contoh ini, dua panggilan ke sizeof() dibuat. Panggilan pertama, dalam fungsi main(), mengembalikan saiz titik tatasusunan sebagai 3 dengan betul. Walau bagaimanapun, panggilan kedua dalam fungsi test() salah mengembalikan 2. Hasil ketidakpadanan ini berlaku kerana titik tatasusunan mereput menjadi penunjuk apabila ia diserahkan kepada fungsi.

Mengatasi Pereputan Tatasusunan

Untuk mengekalkan yang benar saiz tatasusunan apabila dihantar ke fungsi, seseorang mesti secara eksplisit menghantar parameter tambahan kepada fungsi yang menentukan saiz.

void test(int arr[], size_t elems) {
   /* ... */
}

int main(int argc, const char * argv[]) {
   int point[3] = {50, 30, 12};
   /* ... */
   test(point, sizeof(point)/sizeof(point[0]));
   /* ... */
}
Salin selepas log masuk

Dengan menghantar saiz sebagai parameter berasingan, fungsi boleh menentukan dengan tepat saiz tatasusunan dan lakukan operasi dengan sewajarnya.

Nota:

The helah sizeof(point)/sizeof(point[0]) untuk mendapatkan saiz tatasusunan mungkin tidak selalu berfungsi untuk tatasusunan yang diperuntukkan secara dinamik.

Atas ialah kandungan terperinci Mengapakah `sizeof()` Mengembalikan Nilai Berbeza untuk Tatasusunan Dalam dan Luar 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