【问题标题】:How does sizeof wоrk in this case?在这种情况下 sizeof 是如何工作的?
【发布时间】:2020-08-20 11:29:20
【问题描述】:

看下面的代码:

#include <stdio.h>

int main(void) 
{
    int i = 1;
    printf("%lu\n", sizeof(int[++i]));
    printf("%d", i);
}

我正在测试 sizeof 运算符,因为对可变长度数组类型的操作数进行了评估 - 如果有人也对此进行澄清,我会很高兴,但问题不同。

6.5.3.4/2

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。 如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果为整数常量。

上述代码在GCC上的输出如下:

8
2

谁能解释一下这个 8 是从哪里来的?数组是否衰减为指针? 还请说明变长数组部分。

【问题讨论】:

  • int[++i] 在您的代码中变为 int[2]。所以sizeof(int[++i]) 与2 * sizeof(int) 相同,因为sizeof(int) 在你的机器上是4。
  • @Ardent Coder 请告诉我为什么这只需要 int[++i] 而不需要像 int a[++i] 这样的 数组名称。
  • 只有 type 对sizeof 很重要。就像int* 表示一个整数指针(没有像您在函数原型中经常看到的那样指定名称),int[2] 表示一个大小为 2 的整数数组。
  • @Ardent Coder 谢谢

标签: c arrays sizeof


【解决方案1】:

一个 int 有 4 个字节长。您正在向 sizeof 运算符传递一个长度为 2 的 int 数组。要存储一个 2 的 int 数组,您需要 2x4 = 8 个字节。

++i

在使用之前将 i 的值从 1 增加到 2。这就是为什么你的输出是 8 和 2。

【讨论】:

  • "一个 int 是 4 字节长。" 对于 OP,不是一般的,最好更清楚
  • sizeof 不是函数。它是一个运算符。
  • @bruno 你对 OP 是什么意思?
  • @ArdentCoder 我的错。你是对的。我在帖子中对其进行了编辑。
  • @MarvinKlein OP 表示原始海报。 Bruno 的意思是 sizeof int 依赖于编译器。
【解决方案2】:

在评估 int[++i] 时,i 最初的值为 1。所以 int[++i] 评估为 int[2],即大小为 2 的 int 数组。

假设int 在您的系统上是 4 个字节,那么这个数组的大小是 8 个字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2018-04-28
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2018-06-16
    • 2017-06-21
    相关资源
    最近更新 更多