C ++地址值和sizeof

时间:2015-06-11 01:38:52

标签: c++ c 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? 非常感谢

3 个答案:

答案 0 :(得分:9)

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

print &i            output: 0x7fffffffe18c

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

当你致电sizeof(& i)

print sizeof(&i)    output: 8

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

sizeof(i)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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