Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีพิมพ์ขนาดอาร์เรย์พารามิเตอร์ในฟังก์ชัน C++

ภาพรวม

ใน C++ เมื่อส่งอาร์เรย์เข้าไปในฟังก์ชัน อาร์เรย์จะ Decay เป็น Pointer ทำให้ sizeof ภายในฟังก์ชันคืนค่าขนาดของ Pointer (8 bytes บน 64-bit) ไม่ใช่ขนาดอาร์เรย์ทั้งหมด ต้องส่งขนาดมาพร้อมกัน หรือใช้ Template/Reference

ตัวอย่างโค้ดแสดงปัญหา

#include <iostream>
using namespace std;

void func(int a[]) {
    cout << "Size in func: " << sizeof(a);  // 8 bytes (pointer size)
}

int main() {
    int array[5];
    func(array);
    cout << "\nSize in main: " << sizeof(array);  // 20 bytes (5 * 4)
    return 0;
}

ผลลัพธ์

Size in func: 8
Size in main: 20

วิธีแก้ไข (3 วิธี)

1. ส่งขนาดมาพร้อมกัน (Classic Way)

void func(int a[], int size) {
    cout << "Size: " << size * sizeof(int);
}

2. ใช้ Template Reference (C++11) - แนะนำ


template <size_t N>
void func(int (&arr)[N]) {
    cout << "Size: " << sizeof(arr);  // ทำงานถูกต้อง!
    cout << ", Elements: " << N;
}

3. ใช้ std::array หรือ std::vector (Modern C++)


#include <array>
#include <vector>

void funcArray(const array<int, 5>& arr) {
    cout << "Size: " << arr.size() * sizeof(int);
}

void funcVector(const vector<int>& vec) {
    cout << "Size: " << vec.size() * sizeof(int);
}

สรุปการเลือกใช้

วิธีข้อดีข้อเสีย
ส่ง size แยกเข้าใจง่าย, รองรับ C แบบเก่าerror-prone, ไม่ type-safe
Template ReferenceType-safe, compile-time size, zero overheadทำงานได้เฉพาะ fixed-size array
std::arrayRAII, STL compatible, size() methodต้องรู้ขนาด compile-time
std::vectorDynamic size, สะดวกที่สุดHeap allocation, slight overhead

ข้อสังเกตเพิ่มเติม

  • sizeof(array) ใน main() ให้ 20 เพราะ int 4 bytes × 5 elements = 20 bytes
  • ในฟังก์ชัน sizeof(a) ให้ 8 เพราะเป็น pointer (64-bit system)
  • C++20 มี std::span สำหรับ non-owning view ของ contiguous sequence