首页 > 解决方案 > 我无法在 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;
}

标签: c

解决方案


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

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

如果您想知道大小,则必须在它仍然是一个数组时解决它并传递它,例如:

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或一元&运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“类型数组”的表达式将转换为类型为“类型指针”的表达式" 指向数组对象的初始元素,不是左值。如果数组对象具有寄存器存储类,则行为未定义。


推荐阅读