首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ sizeof 數組退化指針陷阱:主函數與函數參數中 sizeof 差異解析

     編輯:程式設計綜合問答

現象

代碼輸出 8 12(或 4 12),主函數中 sizeof(arr) 為 12,傳入函數後 sizeof(arr) 變為 8/4。

核心原理:數組退化為指針


void print(int a[]) {  // 等價於 int *a
    cout << sizeof(a); // 輸出指針大小:64位系統8字節,32位4字節
}

int main() {
    int a[3] = {1,2,3}; // int[3] 類型
    cout << sizeof(a);  // 輸出數組總大小:3 * sizeof(int) = 12
    print(a);           // 數組退化為 int*,丟失長度信息
}

標準庫解決方案

1. 模板推導數組大小 (C++11)


template 
void print(T (&arr)[N]) {
    cout << "數組大小: " << N << ", 總字節: " << sizeof(arr);
}
// 調用:print(a); // 自動推導 N=3

2. std::array 保留大小信息


#include 
void print(const std::array& arr) {
    cout << arr.size(); // 3
}
int main() {
    std::array a = {1,2,3};
    print(a);
}

3. std::vector 動態大小


void print(const std::vector& vec) {
    cout << vec.size();
}

4. 結構體包裹 (C 風格兼容)


struct ArrayWrapper {
    int data[3];
    size_t size;
};
void print(ArrayWrapper* w) {
    cout << w->size;
}

避坑指南

場景sizeof 結果說明
函數參數 int a[]指針大小退化為 int*
函數參數 int a[10]指針大小大小被忽略,仍退化
主函數 int a[3]12完整類型 int[3]
動態分配 new int[3]指針大小返回 int*
std::array<int,3>對象大小包含數組,非退化

最佳實踐

  1. **拒絕裸數組參數**:改用 std::span (C++20)、std::array、std::vector 或模板引用
  2. **C 接口必須雙參**:void func(int* arr, size_t len)
  3. **靜態分析工具**:開啟 -Warray-bounds、Clang-Tidy modernize-avoid-c-arrays

理解數組退化機制,是寫出安全、現代 C++ 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved