void sort(int arr[]) {
int len = sizeof(arr) / sizeof(arr[0]); // 錯誤!arr 是指標
// ...
}
int main() {
int a[] = {99,66,33,2,5,61,6};
sort(a); // 傳遞陣列首址
}
sizeof(arr) 在函數內返回指標大小 (4 或 8 位元組),非陣列總大小。
C 標準規定:陣列作為函數參數時,退化為指向首元素的指標。以下三種宣告等價:
void f(int arr[]);
void f(int arr[10]); // 10 被忽略
void f(int *arr); // 本質
void sort(int arr[], int len)。struct Array { int *data; int len; };。void sort(int (*arr)[10]) 僅接受長度 10 陣列,sizeof(*arr) 有效但靈活性差。void sort(int arr[], int len) {
for (int i = 0; i < len-1; ++i)
for (int j = 0; j < len-1-i; ++j)
if (arr[j] > arr[j+1]) {
int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t;
}
}
int main() {
int a[] = {99,66,33,2,5,61,6};
int len = sizeof(a)/sizeof(a[0]); // 主程式正確計算
sort(a, len);
// ...
}
len 為元素個數。std::vector/std::array 避免此問題。