C++地址值和sizeof

C++ address value and sizeof

在我的电脑上。当我测试代码时:

int main()
{
    int i=123;
    return 0;
}

使用

g++ -g test.cpp -o test

我输入的时候发现:

print &i            output: 0x7fffffffe18c
print sizeof(&i)    output: 8

我一头雾水,i的地址是6字节,为什么sizeof(&i)==8? 非常感谢

执行此操作时,您将获得 i

的地址
print &i            output: 0x7fffffffe18c

输出显示变量 i 存储的地址编号,但 printf 将删除前导零,因此您只能看到 0x7fffffffe18c 而不是 0x00007fffffffe18c ,你可以使用调试器来验证它

当你调用 sizeof(&i)

print sizeof(&i)    output: 8

你得到 8 个字节,因为你得到的是地址的大小而不是变量 i 的大小,如果你想得到变量的大小就这样做

sizeof(i)

地址实际上是0x00007fffffffe18c,打印不显示前导零。

sizeof 适用于类型,而不是值,因为值最终必须存储在某种类型的容器中,并且编译器通常无法预测变量在编译时必须持有什么值时间:

void f(int* ptr);  // does it need to hold 0? 1000? 1<<27?

写的时候

sizeof(i);
size_t f(int* ptr) { return sizeof(ptr); }

实际上被视为等同于

sizeof decltype(i);
size_t f(int* ptr) { return sizeof(decltype(ptr)); }

其中 decltype(i) 计算为任何类型 i 被声明为:

int i; :- decltype(i) evaluates to "int"
int* i; :- decltype(i) evaluates to "int*"
int*& i; :- decltype(i) evaluates to "int*&"

并在 f

sizeof(ptr) :- decltype(ptr) evaluates to "int*"

您编译了一个 64 位可执行文件,因此指针必须能够保存值 [0,1^64),这需要 64 位或 8 个字节。

#include <cstdio>

int main()
{
    int i = 10;
    printf("i = %d, &i = %0p, sizeof(&i) = %d\n", i, &i, sizeof(&i));
}

在 32 位机器上:http://ideone.com/htfy9R