在C中不要对数组参数使用sizeof

使用 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
喜欢就支持一下吧
点赞14 分享