在这种情况下 sizeof 是如何工作的?
How does sizeof wоrk in this case?
看下面的代码:
#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是4个字节长。您正在向 sizeof 运算符传递长度为 2 的 int 数组。要存储 2 的 int 数组,您需要 2x4 = 8 字节。
++i
在使用之前将 i 的值从 1 增加到 2。这就是为什么你的输出是 8 和 2。
在评估 int[++i]
时,i
最初的值为 1。因此 int[++i]
评估为 int[2]
,即 int
的数组尺寸 2。
假设一个 int
在你的系统上是 4 个字节,这个数组的大小是 8 个字节。
看下面的代码:
#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是4个字节长。您正在向 sizeof 运算符传递长度为 2 的 int 数组。要存储 2 的 int 数组,您需要 2x4 = 8 字节。
++i
在使用之前将 i 的值从 1 增加到 2。这就是为什么你的输出是 8 和 2。
在评估 int[++i]
时,i
最初的值为 1。因此 int[++i]
评估为 int[2]
,即 int
的数组尺寸 2。
假设一个 int
在你的系统上是 4 个字节,这个数组的大小是 8 个字节。