问题与长度宏

时间:2013-10-18 14:52:26

标签: c macros

我有一个简单的宏:

#define LENGTH(arr) (sizeof(arr)/sizeof(arr[0]))

无论出于何种原因,在设置类似的内容时似乎工作正常:

int length = LENGTH(arr)

但不要在循环中进行比较

while(i < LENGTH(arr))

3 个答案:

答案 0 :(得分:4)

对于相同的arr,宏将起作用或不起作用。

可能的问题是循环中的arr指针而不是数组。该宏不适用于指针,它只适用于数组。

答案 1 :(得分:4)

请记住,数组在传递时会衰减到指针。因此,如果将数组传递给函数,它不再是数组,而是函数内部的指针。一个指针,它只包含有关类型的信息,但不包含数组的大小。

答案 2 :(得分:-2)

sizeof(arr)与您在执行arr.Count()arr.Length时为更高级别的语言提供的内容不同。

这为您提供了arr变量的存储空间。此表示数组的长度。

如果您有char *arr = malloc(sizeof(*arr) * 100);,而sizeof(arr),则通常(取决于您的系统)获得4.如果您执行sizeof(*arr)sizeof(arr[0]),则相同事情,你有sizeof(char)是1,所以宏给你4/1 = 4:错误。它与char arr[100]一起使用,因为sizeof(arr)给出100,因为数组不会衰减为sizeof的指针类型。