我想知道为什么在以下程序sizeof(int)
中返回的值不同于sizeof(int*)
。
这是一个小程序:
int main(){
std::cout<<sizeof(int)<<endl;
std::cout<<sizeof(int*)<<endl;
return 0;
}
这是输出:
4
8
直到现在我记得整数指针的大小是4byte(gcc编译器)。如何检查指针的正确大小?它是依赖计算机的吗?
我正在运行ubuntu 12.04
# lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 12.04 LTS
Release: 12.04
Codename: precise
指针的大小是不是常数(标准大小)是8个字节。
答案 0 :(得分:15)
int
和int*
的大小完全取决于编译器和硬件。如果您在int*
中看到八个字节,则可能有64位硬件,每个指针转换为八个字节。
希望这有帮助!
答案 1 :(得分:7)
sizeof(char) == 1
没有其他保证(*)。
实际上,指针在16位系统上为2,在32位系统上为4,在64位系统上为8。
<小时/> (*)见James Kanze的评论。
答案 2 :(得分:4)
指针的大小是系统,编译器和体系结构相关的。在32位系统上,它通常是32位,而在64位系统上,它们通常是64位。
如果你试图将一个指针存储到一个整数中以便以后再次恢复到指针,你可以使用类型intptr_t
这是一个足以保持(我相信)正常的非整数类型的整数类型(非函数) )指针类型。
答案 3 :(得分:2)
对于32位系统,'事实上'标准是ILP32 - 即int, long和指针都是32位数量。
对于64位系统,主要的Unix'事实上'标准是LP64 - long和指针是64位(但int是32位)。 Windows 64位 标准是LLP64 - long long和指针是64位(但是long和int 都是32位)。
有一次,一些Unix系统使用了ILP64组织。
这些事实上的标准都不是由C标准立法的 (ISO / IEC 9899:1999),但所有都是允许的。
和
如果您担心可移植性,或者您想要的名称 类型反映了大小,你可以看看标题,在哪里 以下宏可用:
int8_t int16_t int32_t int64_t
int8_t
保证为8位,int16_t
保证为16 比特等。
请参阅此question。