我认为sizeof的参数是针对可变长度数组进行评估的

时间:2017-09-28 15:39:09

标签: c

请考虑

#include <stdio.h>

int main(void) {    
    int size = 1;
    int foo[1];
    int bar[size];

    int* pfoo = 0;
    int* pbar = 0;

    printf("%zu %zu\n", sizeof(pfoo = foo), sizeof(pbar = bar));
    printf("%p %p\n", pfoo, pbar);

    return 0;
}

https://ideone.com/VeiJXH上运行时的输出是

  

8 8

     

(零)(无)

我希望将pbar设置为bar的第一个元素的地址,因为bar是一个可变长度数组。我认为sizeof在运行时被评估为可变长度数组,这意味着pbar将为非零。

发生了什么?这不是一个小测验;它是我在代码中遇到的问题的缩减版本。

编辑:我不认为副本有帮助 - 我的问题是关于不对可变长度数组进行评估的尺寸。

1 个答案:

答案 0 :(得分:7)

赋值的类型是“赋值后左操作数的”(§6.5.16/ 3,强调添加)。在pbar = bar的情况下,左操作数的值为int*类型(因为那是pbar的原因)。

关于sizeof运算符,“如果操作数的类型是可变长度数组类型,则计算操作数;否则,不计算操作数,结果是整数常量。” (§6.5.3.4/ 2)。如上所述,操作数的类型是int*,它不是可变长度数组类型。所以没有评估。

以下是一个坏主意。但它给出了评估将会发生的情况:

printf("%zu\n", sizeof(int[dim = x + y]));
printf("%d\n", dim);