Rumah > pembangunan bahagian belakang > C++ > Mengapakah `sizeof` Mengembalikan Saiz Tatasusunan yang Salah Apabila Menghantar Tatasusunan kepada Fungsi C?

Mengapakah `sizeof` Mengembalikan Saiz Tatasusunan yang Salah Apabila Menghantar Tatasusunan kepada Fungsi C?

Linda Hamilton
Lepaskan: 2024-12-14 15:35:16
asal
923 orang telah melayarinya

Why Does `sizeof` Return an Incorrect Array Size When Passing an Array to a C Function?

Percanggahan Saiz Tatasusunan Apabila Melepasi Fungsi

Pengendali sizeof() melaporkan nilai yang tidak tepat untuk tatasusunan apabila dihantar ke fungsi. 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 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

Apabila dipanggil dari main(), operator sizeof() melaporkan dengan tepat saiz tatasusunan, tetapi dalam fungsi test(), ia meremehkan saiz oleh satu elemen . Jurang ini timbul kerana apabila tatasusunan dihantar ke fungsi dalam C, ia mereput kepada penuding yang merujuk elemen pertama tatasusunan. Akibatnya, sizeof(arr) mengira saiz penuding dan bukannya saiz tatasusunan yang mendasari.

Untuk membetulkan isu ini, saiz tatasusunan hendaklah dihantar secara eksplisit sebagai parameter berasingan kepada fungsi:

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

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

Sebagai alternatif, untuk tatasusunan yang diperuntukkan secara dinamik (tidak ditunjukkan di sini), fungsi perpustakaan C standard stdlib.h boleh digunakan untuk mendapatkan saiz tatasusunan dengan tepat.

Atas ialah kandungan terperinci Mengapakah `sizeof` Mengembalikan Saiz Tatasusunan yang Salah Apabila Menghantar Tatasusunan kepada Fungsi 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