我有一个简单的宏:
#define LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))
无论出于何种原因,在设置以下内容时它似乎都可以正常工作:
int length = LENGTH(arr)
但不要循环比较
while(i < LENGTH(arr))
同样arr
,宏将起作用或不起作用。
可能的问题是arr
循环中的 in 是一个指针而不是一个数组。该宏不适用于指针,它仅适用于数组。
请记住,数组在传递时会衰减为指针。因此,如果将数组传递给函数,则它不再是数组,而是函数内部的指针。一个指针,它只包含关于类型的信息,但不包含数组的大小。
sizeof(arr)
与更高级的语言在您执行arr.Count()
或arr.Length
.
这为您提供了arr
变量的存储空间。这并不意味着数组的长度。
如果你有char *arr = malloc(sizeof(*arr) * 100);
,你sizeof(arr)
通常会(取决于你的系统)得到 4。如果你有sizeof(*arr)
or sizeof(arr[0])
,这是同一件事,你有sizeof(char)
which 是 1,所以宏给你 4/1 = 4 : 错误。它适用于char arr[100]
因为sizeof(arr)
给你 100 因为数组不会衰减为指针类型sizeof
。