我运行了这个示例程序。
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的值应该是不同的。
我错过了什么?
答案 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)==4
,x==5
,sizeof(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 [...]