我无法在C中获得足够的篇幅

时间:2019-05-25 00:28:56

标签: c

我想获取数组长度,尝试按函数使用,但是在函数中,我获取数组长度令人担心,运算结果为2,谁可以帮助我做到这一点。

#include <stdio.h>
#define GET_ARRAY_LEN(array,len){len = (sizeof(array) / sizeof(array[0]));}

void print_arry(int *nums){
        int i;
        int len;

        GET_ARRAY_LEN(nums, len);
        printf("%d\n",len);

        for (i=0; i<len; i++)
                printf ("%d ", nums[i]);
}

int main() {
        int nums[]={ 2,7,3,11,15 };
        int target = 9;

        print_arry(nums);
        return 0;
}

但这是正确的,我没有错。

#include <stdio.h>

#define GET_ARRAY_LEN(array,len){len = (sizeof(array) / sizeof(array[0]));}


int main() {
        int nums[]={ 2,7,3,11,15 };
        int target = 9;
        int len;

        GET_ARRAY_LEN(nums, len);
        printf("%d\n",len);

        return 0;
}

1 个答案:

答案 0 :(得分:2)

将数组传递给函数(或以多种其他方式使用)时,它会衰减为指向该数组第一个元素的指针(a)

这意味着它将是一个指针,其指针的大小 size ,而不是原始数组的大小。

如果您想知道大小,则必须在仍为数组的情况下进行计算,并将其也传递给它,例如:

void print_arry (int *nums, size_t sz) {
    printf ("%z:", sz);
    for (size_t i = 0; i < sz; ++i) {
        printf (" %d", nums[i]);
    }
    putchar ('\n');
}
:
print_arry (nums, sizeof(nums) / sizeof(*nums));

(a)例如,参见C11 6.3.2.1 Lvalues, arrays, and function designators /3

  

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,类型为“类型数组”的 转换为类型为“类型指针”的表达式,该表达式指向数组对象的初始元素 ,而不是左值。如果数组对象具有寄存器存储类,则该行为是不确定的。