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
Lepaskan: 2024-12-19 10:51:09
asal
950 orang telah melayarinya

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

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]));
    /* ... */
}
Salin selepas log masuk

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