如何确定C语言中数组的大小?

也就是说,数组可以容纳多少元素?


当前回答

如果你知道数组的数据类型,你可以像这样使用:

int arr[] = {23, 12, 423, 43, 21, 43, 65, 76, 22};

int noofele = sizeof(arr)/sizeof(int);

或者如果你不知道数组的数据类型,你可以使用类似这样的东西:

noofele = sizeof(arr)/sizeof(arr[0]);

注意:只有当数组在运行时没有定义(如malloc)并且数组没有传递到函数中时,这个东西才有效。在这两种情况下,arr(数组名)都是指针。

其他回答

您可以使用sizeof操作符,但它不适用于函数,因为它将接受指针的引用。 您可以执行以下操作来查找数组的长度:

len = sizeof(arr)/sizeof(arr[0])

代码最初在这里找到:

查找数组中元素个数的C程序

sizeof(array) / sizeof(array[0])

除了已经提供的答案,我想指出一个特殊的情况下使用

sizeof(a) / sizeof (a[0])

如果a是char、unsigned char或signed char的数组,则不需要使用sizeof两次,因为带有这些类型的一个操作数的sizeof表达式的结果总是1。

引用自C18,6.5.3.4/4:

当sizeof应用于具有char类型、unsigned char类型或signed char类型(或其限定版本)的操作数时,结果为1。

因此,如果a是char、unsigned char或signed char类型的数组,sizeof(a) / sizeof(a[0])将等效于NUMBER OF ARRAY ELEMENTS / 1。除1是多余的。

在这种情况下,你可以简单地缩写为do:

sizeof(a)

例如:

char a[10];
size_t length = sizeof(a);

如果你想要证明,这里有一个GodBolt的链接。


尽管如此,如果类型发生重大变化(尽管这种情况很少见),该部门仍会保持安全。

如果你正在处理没有作为参数接收的数组,sizeof方式是正确的方式。作为参数发送给函数的数组被视为指针,因此sizeof将返回指针的大小,而不是数组的大小。

因此,在函数内部,此方法不起作用。相反,始终传递一个额外的参数size_t size,指示数组中元素的数量。

测试:

#include <stdio.h>
#include <stdlib.h>

void printSizeOf(int intArray[]);
void printLength(int intArray[]);

int main(int argc, char* argv[])
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };

    printf("sizeof of array: %d\n", (int) sizeof(array));
    printSizeOf(array);

    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
    printLength(array);
}

void printSizeOf(int intArray[])
{
    printf("sizeof of parameter: %d\n", (int) sizeof(intArray));
}

void printLength(int intArray[])
{
    printf("Length of parameter: %d\n", (int)( sizeof(intArray) / sizeof(intArray[0]) ));
}

输出(64位Linux操作系统):

sizeof of array: 28
sizeof of parameter: 8
Length of array: 7
Length of parameter: 2

输出(32位windows操作系统):

sizeof of array: 28
sizeof of parameter: 4
Length of array: 7
Length of parameter: 1

要知道在代码中显式声明并由其变量引用的固定数组的大小,可以使用sizeof,例如:

int a[10];
int len = sizeof(a)/sizeof(int);

但这通常是没有用的,因为你已经知道答案了。

但如果你有一个指针,你不能使用sizeof,这是一个原则问题。

但是…由于数组是作为线性内存提供给用户的,如果您知道最后一个元素地址,并且如果您知道类型的大小,那么您就可以计算它有多少个元素。例如:

#include <stdio.h>

int main(){
    int a[10];
    printf("%d\n", sizeof(a)/sizeof(int));
    int *first = a;
    int *last = &(a[9]);
    printf("%d\n", (last-first) + 1);
}

输出:

10
10

另外,如果你不能利用编译时,你可以:

#include <stdio.h>

int main(){
    int a[10];
    printf("%d\n", sizeof(a)/sizeof(int));
    void *first = a;
    void *last = &(a[9]);
    printf("%d\n", (last-first)/sizeof(int) + 1);
}