开发者

Does sizeof work at compile time?

开发者 https://www.devze.com 2023-03-30 14:22 出处:网络
I ran this sample program. const int x = 5; int main(int argc, char** argv) { int x[x]; int y = sizeof(x) / sizeof(int);

I ran this sample program.

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

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

    return 0;
}

The Value of y is 5.

But how is this possible? Because when I debugged, the value of x wa开发者_高级运维s 5, so the size of x is 4 and size of int is 4. And value of y should have been different .

What am I missing?


sizeof(x) refers to the array which has 5 elements of type int. Hence the output.

The code would be a lot easier to understand if you didn't overload the name x.

Technically what you have here is a variable length array, a VLA. This is because C const actually means read-only and has to be evaluated at run time. Hence sizeof, in this case, is evaluated at runtime.

If you had used a literal to size your array instead, i.e. int x[5]; then sizeof would have been evaluated at compile time.

If the code had been compiled as C++ then the const would be a true const, and so available for evaluation at compile time.


You have variable hiding going on here. Your code is roughly equivalent to:

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

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

    return 0;
}

Then it's clearer: sizeof(x)==4, x==5, sizeof(x2)==20.


x is of type int[5]. Therefore, the size is 5*sizeof(int). sizeof is an operator, not a function or a macro.

This is why some people get annoyed when people claim that C arrays are just pointers, but unfortunately you can't pass an array. You can only pass a pointer to it's first element, and you loose this information.


Since int x is const, this is a fixed size array. Sizeof is calculated at compilation time.

x has five elements, as the definition clearly shows. It's size is 5 * sizeof(int).

This is GCC, I use printf to print out the value of y:

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

Both the allocated space and the value of y is compiled as constants.

Also, from the standard:

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 [...]
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号