Rumah >pembangunan bahagian belakang >C++ >Mengapakah `sizeof` Memberi Saiz Tatasusunan Berbeza Di Dalam dan Di Luar Fungsi C?

Mengapakah `sizeof` Memberi Saiz Tatasusunan Berbeza Di Dalam dan Di Luar Fungsi C?

Susan Sarandon
Susan Sarandonasal
2024-12-19 10:51:09851semak imbas

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

Mengapa Pengiraan Saiz Tatasusunan Berbeza Di Dalam Fungsi dalam C

Apabila menghantar tatasusunan kepada fungsi, C secara automatik mereput tatasusunan menjadi penunjuk kepada elemen pertamanya. Penunjuk ini membawa alamat elemen tatasusunan pertama tetapi bukan saiznya.

Pertimbangkan contoh ini:

#include <stdio.h>

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

int main() {
    int point[3] = {50, 30, 12};

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

    test(point);

    return 0;
}

Secara utama, sizeof(point) dengan betul memberikan saiz keseluruhan array ( 12 bait). Walau bagaimanapun, dalam ujian, sizeof(arr) menghasilkan 4 bait (saiz penunjuk integer), mengakibatkan pengiraan saiz tatasusunan yang salah (tiada satu elemen).

Untuk menyelesaikan masalah ini, saiz tatasusunan mestilah jelas diluluskan sebagai parameter berasingan:

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

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

Perhatikan bahawa sizeof(point)/sizeof(point[0]) berfungsi untuk tatasusunan yang diperuntukkan tindanan tetapi bukan untuk tatasusunan yang diperuntukkan secara dinamik kerana ia bergantung pada mekanisme pereputan asas.

Atas ialah kandungan terperinci Mengapakah `sizeof` Memberi Saiz Tatasusunan Berbeza Di Dalam dan Di Luar 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