虽然晚了3年,但总比没有好。
简短回答
#define length(array) ((sizeof(array)) / (sizeof(array[0])))
长回答
因此,使用 sizeof(array)
会返回 数组类型的大小
* 元素数量
。了解了这点,我们可以实现以下操作:
#define length(array) ((sizeof(array)) / (sizeof(array[0])))
你可以像这样使用它:
type yourArray[] = {your, values}
length(yourArray)
例如:
#include <stdlib.h>
#include <stdio.h>
#define length(array) ((sizeof(array)) / (sizeof(array[0])))
int main()
{
const char *myStrings[] = {"Foo", "Bar", "Hello, World!"};
int myNums[] = {0, 1, 5, 7, 11037};
char myChars[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
printf("Length of myStrings array: %lu\n", length(myStrings));
printf("Length of myNums array: %lu\n", length(myNums));
printf("Length of myChars array: %lu\n", length(myChars));
return 0;
}
我测试过它,而且它也可以与未初始化的数组一起使用,可能是因为它们包含了同一类型的垃圾(来自未初始化)。整数未初始化数组包含随机整数,const char*未初始化数组包含(null),这被视为const char*。
现在,这只适用于栈上的数组。指向堆中预留空间用作数组的指针会产生意想不到的结果。例如:
int *myNums = (int *)malloc(3 * sizeof(int)); // Space for 3 integers
printf("Length of myNums: %lu\n", length(myNums)); // Outputs 2 instead of 3
所以请注意。谁会在堆上使用数组呢,反正不要管。
注意:这与此问题相关,因为它可以像请求的那样使用const char *。它也适用于其他类型。
strlen
可能会更快,因为它具有编译器特定的优势。无论如何,最好使用已经为您编写的代码。 - Etienne de Martelstrlen()
函数? - Galikstd::string
,然后就可以使用它的size()
方法。 - Etienne de Martelconst char*
是一个指针。它本身没有长度。如果它指向以空字符结尾的char
数组,你可以谈论该数组的长度。不要混淆指针和数组;这会导致无尽的混乱。 - Pete Becker