Rumah >pembangunan bahagian belakang >C++ >Mengapakah `sizeof` Mengembalikan Saiz Tatasusunan yang Salah Apabila Menghantar Tatasusunan kepada Fungsi C?
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!