【问题标题】:I thought that the arguments of sizeof were evaluated for a variable length array [duplicate]我认为 sizeof 的参数是针对可变长度数组进行评估的[重复]
【发布时间】:2018-03-10 10:29:24
【问题描述】:

请考虑

#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 将不为零。

发生了什么事?这不是测验;这是我在代码中遇到的问题的简化版本。

编辑:我不认为重复在这里有帮助 - 我的问题是 sizeof 没有被评估为可变长度数组。

【问题讨论】:

  • pbar = bar 的结果类型是int*。它与VLA大小无关,因此编译器不需要对其进行评估。
  • @BLUEPIXY:啊,我完全理解。请问你能回答吗?

标签: c


【解决方案1】:

赋值的类型是“赋值后左操作数的”(第 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);

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2013-02-06
    • 1970-01-01
    • 2019-01-10
    • 2012-10-16
    • 2013-06-23
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多