首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言數組大小與元素個數:sizeof 陷阱與正確計算方法

     編輯:關於C

C 語言中 sizeof 是編譯期運算符,返回類型或表達式佔用的內存字節數。初學者極易混淆「數組大小(字節數)」與「元素個數」,導致邏輯錯誤。本文通過三種類型數組對比、strlen 干擾項分析,徹底釐清兩者關係與計算方法。

核心概念區分

概念含義計算方法
數組大小數組佔用的總內存字節數sizeof(array)
元素個數數組中元素的數量sizeof(array) / sizeof(array[0])

對比演示代碼

#include 
#include 

#define SIZE 7

typedef struct Person {
    int age;
    char *name;
    char flag;
} Person_t;

int main() {
    int array1[SIZE];      // int 數組
    char array2[SIZE];     // char 數組
    Person_t array3[SIZE]; // 結構體數組

    printf("int 數組: 大小=%zu, 元素個數=%zu\n",
           sizeof(array1), sizeof(array1)/sizeof(int));

    printf("char 數組: 大小=%zu, 元素個數=%zu\n",
           sizeof(array2), sizeof(array2)/sizeof(char));

    // 陷阱:char 數組作字符串時 strlen 返回字符長度(不含 \0)
    printf("char 數組 strlen: %zu\n", strlen(array2)); // 未初始化,結果不定

    printf("結構體數組: 大小=%zu, 元素個數=%zu\n",
           sizeof(array3), sizeof(array3)/sizeof(Person_t));

    return 0;
}

運行結果(64 位系統典型輸出)

int 數組: 大小=28, 元素個數=7
char 數組: 大小=7, 元素個數=7
char 數組 strlen: 7
結構體數組: 大小=84, 元素個數=7

關鍵觀察

  • 不同類型數組大小不同:int 4 字節×7=28,char 1 字節×7=7,結構體 12 字節×7=84(含對齊填充)。
  • 元素個數相同:均為宏 SIZE=7 指定。
  • char 數組特殊性:若作字符串用,strlen 返回有效字符長度(遇 \0 停止),不等於 數組大小或元素個數(除非滿存無 \0)。
  • sizeof 運算對象:作用於數組名時返回整個數組大小;作用於指針時返回指針大小(4/8 字節),不再是數組大小。

經典陷阱:函數參數退化為指針

void print_size(int arr[]) {  // 等價 int *arr
    printf("函數內 sizeof(arr)=%zu\n", sizeof(arr)); // 輸出 8 (64位指針大小)
}

int main() {
    int a[10];
    printf("主函數 sizeof(a)=%zu\n", sizeof(a)); // 輸出 40
    print_size(a);
    return 0;
}

對策:函數接收數組時,必須額外傳遞長度參數,或使用結構體封裝 {int *data; size_t len;}。

正確計算元素個數的宏

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

// 使用
int a[10];
printf("元素個數: %zu\n", ARRAY_SIZE(a)); // 10
// ARRAY_SIZE(ptr) 會編譯報警/產生錯誤結果,可配合 _Static_assert 防誤用

總結

  1. sizeof(array) = 數組大小(字節),編譯期常量。
  2. 元素個數 = sizeof(array) / sizeof(element_type),只在數組定義可見的作用域內有效。
  3. char 數組若作字符串,strlen ≠ 數組大小 ≠ 元素個數,三者完全不同。
  4. 函數參數數組退化為指針,sizeof 失效,必須顯式傳長度。

牢記:「sizeof 看字節,除以單元素得個數;指針不是數組,傳長避免坑」。

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