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

C 語言獲取數組長度:sizeof 運算符、字符串 \0 結束標誌、動態數組無長度信息

     編輯:C 語言問答

C 語言獲取數組長度:sizeof 運算符、字符串 \0 結束標誌、動態數組無長度信息

C 語言數組本身不攜帶長度信息,獲取長度的方法取決於數組類型與上下文。

靜態/棧上數組:sizeof 運算符

int arr[10];
size_t len = sizeof(arr) / sizeof(arr[0]);  // 10
// 或 C99 變長數組
int n = 10;
int vla[n];
len = sizeof(vla) / sizeof(vla[0]);  // 10
  • `sizeof(arr)` 獲取整個數組佔用字節數
  • 除以單元素大小得元素個數
  • 僅在數組聲明可見的作用域內有效

函數參數退化為指針:長度丟失

void func(int arr[]) {  // 實為 int *arr
    // sizeof(arr) 這裡是指針大小 (4/8 字節),非數組大小!
    // 必須額外傳遞長度參數
}
void func_safe(int arr[], size_t len);  // 推薦簽名

字符串:以 \0 結束約定

char str[] = "hello";
size_t len = strlen(str);  // 5,掃描至 \0,O(n)
// 或
size_t len = 0;
while (str[len]) len++;    // 手動計數
  • 適用於以空字符結尾的字符數組/指針
  • 不適用於包含嵌入 `\0` 的二進制數據

動態分配數組:完全無長度信息

int *dyn = malloc(n * sizeof(int));
// dyn 指針本身無任何長度元數據
// 必須程序員自己記住 n,或封裝結構體
struct DynArray { int *data; size_t len; size_t cap; };

最佳實踐總結

場景獲取長度方法注意
本地靜態數組`sizeof(arr)/sizeof(arr[0])`編譯期常量,零開銷
函數參數數組額外傳 `size_t len` 參數API 契約一部分
字符串`strlen(str)`O(n),確保以 \0 結尾
動態數組封裝結構體攜帶長度RAII 風格管理
多維數組各維分別 `sizeof`僅最外層完整類型可見時

現代 C 封裝範例

typedef struct {
    int *data;
    size_t size;
    size_t capacity;
} IntVec;

IntVec* vec_new(size_t cap) {
    IntVec *v = malloc(sizeof(IntVec));
    v->data = malloc(cap * sizeof(int));
    v->size = 0;
    v->capacity = cap;
    return v;
}

void vec_push(IntVec *v, int val) {
    if (v->size == v->capacity) {
        v->capacity *= 2;
        v->data = realloc(v->data, v->capacity * sizeof(int));
    }
    v->data[v->size++] = val;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved