尽管数组元素的数量很多,但函数中数组的c sizeof函数总是四个字节

时间:2015-08-30 12:45:27

标签: c arrays function-pointers sizeof

当我打印(第一个元素的数组/大小)时,我得到了正确的答案,但是当我在函数中执行相同的操作时,我得到的数组大小为4,并且数组的第一个元素的大小为4,因此除法总是一个。

class MyClass: NSView
{
    var myClassVar: NSColor
}

2 个答案:

答案 0 :(得分:1)

sizeof不是在运行时调用的函数,即使它看起来像一个。这是编译器的一个特性。它查看数据对象并用常量替换sizeof()表达式。

int arr[10];
int size = sizeof(arr)/sizeof(int);

这很有效,因为compielr可以看到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失败,函数参数中的数组只是作为简单的指针传递。

答案 1 :(得分:0)

将数组传递给函数时,实际上只是将指针传递给第一个元素,因此在sizer的主体中,参数array只是指向{{1}的指针。 }。你的函数正确返回int(在我的机器上是2而不是4),尽管这可能不是你想要的。 C中的函数确实没有任何方法可以计算传递数组的长度,这就是为什么在C中标准将数组中的元素数作为任何函数中的参数之一传递的原因数组参数。