为什么 sizeof() 不打印 16 个字节而不是 8 个字节?
Why isn't sizeof() printing 16 bytes instead of 8?
非常简单的程序,我只是在测试 sizeof()
函数并尝试查看它是否有效。如果 sizeof() 真的用位来做 return 事情,当我有这两个元素时,它不应该 return 16 而不是 8 吗?因为 long long
在 C++ 中是 8 个字节,而我有两个元素?
int main()
{
long long whatever[] = {0};
std::cout << whatever[0] << std::endl;
whatever[2] = 10;
std::cout << "The size of this array is " << sizeof(whatever[0] + whatever[2]) << std::endl;
}
这是未定义的行为
long long whatever[] = {0};
std::cout << whatever[0] << std::endl;
whatever[2] = 10; // BAD
代码将 whatever
静态初始化为一个元素的数组。然后你给 whatever[2]
赋值。该数组中唯一有效的索引是 0
。将任何内容分配给索引 1
或 2
会覆盖堆栈上的重要内容或做其他邪恶的事情。
你的意思可能是:
long long whatever[2] = {0};
std::cout << whatever[0] << std::endl;
whatever[1] = 10;
std::cout << "The size of this array is " << sizeof(whatever) << std::endl;
您测量的不是数组的大小,而是两个 long long
之和的大小。即,
sizeof(whatever[0] + whatever[2])
与
基本相同
sizeof(long long)
你指出的是 8。
您声明了一个只有一个元素的数组。所以这个数组的有效索引是0。因此在这个表达式中使用等于2的值作为索引值
whatever[2] = 10;
导致访问超出调用未定义行为的数组的内存。
至于运算符 sizeof
那么它不会评估其操作数。它只确定其操作数的类型和 returns 这种类型的对象的大小。
所以这个表达式
sizeof(whatever[0] + whatever[2])
其中您可以为数组使用无效索引 whatever
等同于表达式
sizeof( long long )
来自 C++ 14 标准 (5.3.3 Sizeof)
1 The sizeof operator yields the number of bytes in the object
representation of its operand. The operand is either an expression,
which is an unevaluated operand (Clause 5), or a parenthesized
type-id.
非常简单的程序,我只是在测试 sizeof()
函数并尝试查看它是否有效。如果 sizeof() 真的用位来做 return 事情,当我有这两个元素时,它不应该 return 16 而不是 8 吗?因为 long long
在 C++ 中是 8 个字节,而我有两个元素?
int main()
{
long long whatever[] = {0};
std::cout << whatever[0] << std::endl;
whatever[2] = 10;
std::cout << "The size of this array is " << sizeof(whatever[0] + whatever[2]) << std::endl;
}
这是未定义的行为
long long whatever[] = {0};
std::cout << whatever[0] << std::endl;
whatever[2] = 10; // BAD
代码将 whatever
静态初始化为一个元素的数组。然后你给 whatever[2]
赋值。该数组中唯一有效的索引是 0
。将任何内容分配给索引 1
或 2
会覆盖堆栈上的重要内容或做其他邪恶的事情。
你的意思可能是:
long long whatever[2] = {0};
std::cout << whatever[0] << std::endl;
whatever[1] = 10;
std::cout << "The size of this array is " << sizeof(whatever) << std::endl;
您测量的不是数组的大小,而是两个 long long
之和的大小。即,
sizeof(whatever[0] + whatever[2])
与
基本相同sizeof(long long)
你指出的是 8。
您声明了一个只有一个元素的数组。所以这个数组的有效索引是0。因此在这个表达式中使用等于2的值作为索引值
whatever[2] = 10;
导致访问超出调用未定义行为的数组的内存。
至于运算符 sizeof
那么它不会评估其操作数。它只确定其操作数的类型和 returns 这种类型的对象的大小。
所以这个表达式
sizeof(whatever[0] + whatever[2])
其中您可以为数组使用无效索引 whatever
等同于表达式
sizeof( long long )
来自 C++ 14 标准 (5.3.3 Sizeof)
1 The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is an unevaluated operand (Clause 5), or a parenthesized type-id.