使用 sizeof 直接查找数组的大小可能会导致代码中出现错误,因为数组参数被视为指针。考虑下面的程序。
null
C
// C Program to demonstrate incorrect usage of sizeof() for // arrays #include <stdio.h> void fun( int arr[]) { int i; // sizeof should not be used here to get number // of elements in array int arr_size = sizeof (arr) / sizeof (arr[0]); for (i = 0; i < arr_size; i++) { arr[i] = i; } // executed only once } // Driver Code int main() { int i; int arr[4] = { 0, 0, 0, 0 }; fun(arr); // use of sizeof is fine here for (i = 0; i < sizeof (arr) / sizeof (arr[0]); i++) printf ( " %d " , arr[i]); getchar (); return 0; } |
说明: 当函数fun()接收数组参数“arr[]”并尝试使用 sizeof操作员。
在C语言中,数组参数被视为指针(参见 这 详细信息)。所以,表达 sizeof(arr)/sizeof(arr[0]) 变成 sizeof(int*)/sizeof(int) 结果是1(int的大小和int*的大小是4),而for循环inside fun()只执行一次,与数组的大小无关。所以, sizeof 在这种情况下,不应该用来获取大量元素。
解决方案:
1) 使用单独的参数: 数据类型的单独参数 尺寸 对于数组大小或长度,应将其传递给fun()。 尺寸 是至少16位的无符号整数类型。所以 更正的程序将是:
C
// C Program to demonstrate correct usage of sizeof() for // arrays #include <stdio.h> void fun( int arr[], size_t arr_size) { int i; for (i = 0; i < arr_size; i++) { arr[i] = i; } } // Driver Code int main() { int i; int arr[] = { 0, 0, 0, 0 }; size_t n = sizeof (arr) / sizeof (arr[0]); fun(arr, n); printf ( "The size of the array is: %ld" , n); printf ( "The elements are:" ); for (i = 0; i < n; i++) printf ( " %d " , arr[i]); getchar (); return 0; } |
输出
The size of the array is: 4 The elements are: 0 1 2 3
2) 使用宏: 我们甚至可以定义 宏 使用 #定义 要查找数组的大小,如下所示,
C
// C Program to demonstrate usage of macros to find the size // of arrays #include <stdio.h> #define SIZEOF(arr) sizeof(arr) / sizeof(*arr) void fun( int arr[], size_t arr_size) { int i; for (i = 0; i < arr_size; i++) { arr[i] = i; } } // Driver Code int main() { int i; int arr[] = { 0, 0, 0, 0, 0 }; size_t n = SIZEOF(arr); fun(arr, n); printf ( "The size of the array is: %ld" , n); printf ( "The elements are:" ); for (i = 0; i < n; i++) printf ( " %d " , arr[i]); return 0; } |
输出
The size of the array is: 5 The elements are: 0 1 2 3 4
3) 使用指针算法: 我们可以使用 (&arr)[1]–arr 查找数组的大小。在这里 啊 指向数组的第一个元素,其类型为 int*。 和 &啊 类型为 int*[n] 并指向整个阵列。因此,它们的差异相当于数组的大小。
C
// C Program to demonstrate usage of pointer arithmetic to // find the size of arrays #include <stdio.h> void fun( int arr[], size_t arr_size) { int i; for (i = 0; i < arr_size; i++) { arr[i] = i; } } // Driver Code int main() { int i; int arr[] = { 0, 0, 0, 0, 0 }; size_t n = (&arr)[1] - arr; fun(arr, n); printf ( "The size of the array is: %ld" , n); printf ( "The elements are:" ); for (i = 0; i < n; i++) printf ( " %d " , arr[i]); return 0; } |
输出
The size of the array is: 5 The elements are: 0 1 2 3 4
如果您发现上述文章有任何不正确之处,或者您想分享有关上述主题的更多信息,请发表评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END