找到数组大小时出错

时间:2014-07-02 18:39:27

标签: c arrays sizeof

我试图找出C中数组的大小。

我的第一个实施是基于this question的接受答案:

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

但那总是给我一个。我试过这样做:

int size = sizeof(arr);

无论数组的大小如何,每次都给我4次。

这是我使用的代码的最小示例。

void findSize(int arr[]) {
    int size = sizeof(arr);
    printf("%d\n",size);
}

int main(int argc, char** argv) {
    int arr[] = {4,6,9,2,6,3,7,2,5,1,2};
    findSize(arr);
}

无论我使用哪种数组,此代码始终打印4。

为什么打印4,如何找到阵列的实际大小?

3 个答案:

答案 0 :(得分:2)

您:

void findSize(int arr[]) {

相当于:

void findSize(int arr[3424]) {

与:

相同
void findSize(int *arr) {

因此sizeof(arr)内的findSize会评估指针的大小。

在C99中你可以这样做(read more about it here):

void findSize(int n, int arr[n]) {

但即使在这种情况下,sizeof(arr)也会返回指针的大小。

为什么?由于数组变量会自动衰减到指向第一个元素的指针。

更新:C99中的参数错误,sizeof仅适用于函数体中声明的变长数组。感谢@rslemos。并且下标可以正确地推进嵌套数组的指针see example

答案 1 :(得分:1)

当你将一个数组传递给一个函数时,它会衰减到一个指向数组中第一个元素的指针,而sizeof运算符只能得到指针的大小,而不是它指向的数组。

如果要将数组的大小传递给函数,则必须将其作为参数传递。

答案 2 :(得分:0)

该函数只传递一个指向第一个元素的指针,而不是整个数组。