在我的电脑上。当我测试代码时:
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
?
非常感谢
答案 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