当我打印(数组的大小/第一个元素的大小)时,我得到了正确的答案,但是当我在函数中执行相同的操作时,我得到数组的大小为 4 并且数组第一个元素的大小为 4,因此除法始终为 1。
#include<stdio.h>
int sizer(int *);
int main()
{
int num;
printf("Please an index: ");
scanf("%d",&num);
int array[num];
int size = sizer(array); //function to calculate array length
/*answer is always 4*/
printf("%d\n", size);
/*answer is correct*/
printf("%d\n", sizeof(array) / sizeof(array[0]));
return 0;
}
/*function to calculate array length*/
int sizer(int *array)
{
return sizeof(array) / sizeof(array[0]);
}
最佳答案
sizeof
不是一个在运行时调用的函数,尽管它看起来像一个。这是编译器的一个功能。它查看数据对象并替换 sizeof()
带有常数的表达式。
int arr[10];
int size = sizeof(arr)/sizeof(int);
这是有效的,因为编译器可以看到 arr
有多大是。 arr
这里是一个静态大小的数组。两者sizeof
表达式被替换为适当的值。
int arr[10];
int size = sizer(arr);
....
int sizer(int array[]) {
return (sizeof(array)/sizeof(int));
}
这行不通。在 sizer
, array
看起来像一个数组,但作为参数传入的数组实际上只是指向数组类型的指针。所以sizeof(array)
相当于 sizeof(int *)
scanf("%d",&num);
int arr[num];
int size1 = sizeof(arr)/sizeof(int);
int size2 = sizer(arr);
....
int sizer(int array[]) {
return (sizeof(array)/sizeof(int));
}
在这里,size1
有效,但是size2
没有。创建arr
实际上是这样分配的:
int arr_sizeof = sizeof(int)*num;
int *arr = alloca(arr_sizeof);
然后,sizeof(arr)
悄然被arr_sizeof
取代。但编译器只能在arr
相同的范围内执行此操作。被创建,因为当 arr
被传递到sizer
它只是转换为 int *
同样,因此尺寸信息不会被保留。 sizer
由于同样的原因失败,函数参数中的数组只是作为简单指针传递。
关于arrays - 无论数组元素的数量如何,函数中数组的 c sizeof 函数始终为四个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296706/