C 語言數組本身不攜帶長度信息,獲取長度的方法取決於數組類型與上下文。
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
void func(int arr[]) { // 實為 int *arr
// sizeof(arr) 這裡是指針大小 (4/8 字節),非數組大小!
// 必須額外傳遞長度參數
}
void func_safe(int arr[], size_t len); // 推薦簽名
char str[] = "hello";
size_t len = strlen(str); // 5,掃描至 \0,O(n)
// 或
size_t len = 0;
while (str[len]) len++; // 手動計數
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` | 僅最外層完整類型可見時 |
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;
}