给定一个数组,其长度由其配置定义:
int a[] = {1,2,3,4,5,6,......n}; // Size of the array may change adding/deleting elements
是否有可能在运行时知道数组长度,例如,循环所有数组元素而不必手动将循环限制设置为n?
int a[] = {1,2,3,4,5};
float b[] = {1.2, 0.1, 3.2};
printf("Array a size is %d\n", dim(a));
printf("Array b size is %d\n", dim(b));
如何定义dim()
?
答案 0 :(得分:4)
假设它是在全局或局部范围内定义的实际数组,而 NOT 是函数的参数,您可以这样做:
int len = sizeof(a) / sizeof(a[0]);
第一部分sizeof(a)
为您提供以字节为单位的总大小,第二部分sizeof(a[0])
为您提供一个成员的字节大小。无论数组的类型如何,除以它们都会给出元素的数量。
如果数组是函数参数它不会工作的原因是因为数组在传递给函数时会衰减到指向第一个元素的指针。所以这个:
void func(int a[]);
等同于:
void func(int *a);
因此,在函数参数上使用上面的表达式将不会产生预期的结果。
答案 1 :(得分:0)
您可以将dim()
实施为:
#define dim(x) (sizeof(x)/sizeof(x[0]))
这基于以下事实:sizeof(a)
返回数组的总大小(以字节为单位),除数sizeof(a[0])
返回数组中单个成员的大小(以字节为单位)。除法的结果是元素的数量。
将此定义添加到您的代码中,运行它,它会打印:
Array a size is 5
Array b size is 3
注意:仅当数组未传递给函数as explained in this comprehensive answer to a similar question时才有效。
如果需要在函数内部使用数组大小,请始终传递一个额外的参数size_t size
,指示数组中的元素数。
#include <stdio.h>
#include <stdlib.h>
#define dim(x) (sizeof(x)/sizeof(x[0]))
void printLength(int intArray[], size_t size);
int main(int argc, char* argv[])
{
int array[] = { 0, 1, 2, 3, 4, 5, 6 };
printf("Length of array: %d\n", (int)dim(array) );
printLength(array, (size_t)dim(array));
}
void printLength(int intArray[], size_t size)
{
printf("Wrong length of parameter: %d\n", (int)dim(intArray));
printf("Correct length of parameter: %d\n", (int)size);
}