【发布时间】:2012-01-05 22:24:56
【问题描述】:
我的 C 代码中有一个用于计算数组大小的宏:
#define sizearray(a) (sizeof(a) / sizeof((a)[0]))
当我测试它时,它适用于静态定义的数组,但不适用于动态定义的数组(见下文)。不知道我明白为什么会这样。有什么方法可以计算分配在堆上的数组的大小吗?
/* test sizearray macro */
void testSIZEARRAY(void)
{
/* test case for statically defined array */
int a[5] = {0,0,0,0,0};
assert(sizearray(a) == 5);
/* test case for dynamically defined array */
int *b;
b = calloc(5, sizeof(int));
assert(sizearray(b) == 5);
free(b);
}
【问题讨论】:
-
sizeof 在编译时进行评估。所以,不,那是不可能的。
-
@ordag
sizeof如果可以的话,会在编译时进行评估。它在运行时针对 VLA 进行评估。