执行摘要:
int a[17];
size_t n = sizeof(a)/sizeof(a[0]);
完整答案:
要确定数组的大小(以字节为单位),可以使用sizeof
运算符:
int a[17];
size_t n = sizeof(a);
在我的计算机上,整数是 4 个字节长,所以 n 是 68。
要确定数组中元素的数量,我们可以将数组的总大小除以数组元素的大小。您可以使用类型执行此操作,如下所示:
int a[17];
size_t n = sizeof(a) / sizeof(int);
并得到正确的答案(68/4 = 17),但如果类型a
改你将有一个讨厌的错误,如果你忘了改变sizeof(int)
为好。
因此,首选除数是sizeof(a[0])
,即数组的零齿数的大小。
int a[17];
size_t n = sizeof(a) / sizeof(a[0]);
另一个优点是,您现在可以轻松地在宏中参数化数组名称并获取:
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))
int a[17];
size_t n = NELEMS(a);
如果您正在处理未作为参数接收的数组,则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* p = a;
assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));