sizeof是否在编译时工作?

时间:2011-08-24 08:20:39

标签: c sizeof

我运行了这个示例程序。

const int x = 5;
int main(int argc, char** argv)
{
    int x[x];

    int y = sizeof(x) / sizeof(int);

    return 0;
}

y的值是5。

但这怎么可能?因为当我调试时,x的值是5,所以x的大小是4,int的大小是4.而y的值应该是不同的。

我错过了什么?

4 个答案:

答案 0 :(得分:7)

sizeof(x)指的是具有5类型int个元素的数组。因此输出。

如果您没有重载名称x,那么代码将更容易理解。

从技术上讲,这里有一个可变长度数组,一个VLA。这是因为C const实际上意味着只读,必须在运行时进行评估。因此,在这种情况下,sizeof在运行时进行评估。

如果您使用文字来调整数组大小,即int x[5];,那么sizeof将在编译时进行评估。

如果代码编译为C ++,那么const将是一个真正的const,因此可以在编译时进行评估。

答案 1 :(得分:4)

你有变量隐藏在这里。您的代码大致相当于:

const int x = 5;
int main(int argc, char** argv)
{
    int x2[x];

    int y = sizeof(x2) / sizeof(int);

    return 0;
}

然后更清楚:sizeof(x)==4x==5sizeof(x2)==20

答案 2 :(得分:0)

x的类型为int [5]。因此,大小为5 * sizeof(int)。 sizeof是一个运算符,而不是函数或宏。

这就是为什么当人们声称C数组只是指针时,有些人会生气,但很遗憾你无法传递数组。您只能将指针传递给它的第一个元素,并且您将丢失此信息。

答案 3 :(得分:-2)

由于int x是const,因此这是一个固定大小的数组。 Sizeof在编译时计算。

x有五个要素,正如定义清楚显示的那样。它的大小是5 * sizeof(int)。

这是GCC,我用printf打印出y的值:

subl    $48, %esp
movl    $5, 4(%esp)`

分配的空间和y的值都被编译为常量。

另外,从标准:

If the size is an integer constant expression and the element type has
a known constant size, the array type is not a variable length array type [...]
相关问题