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
Linda Hamiltonasal
2024-12-14 15:35:16861semak imbas

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;
}

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]));
    // ...
}

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!

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