为什么 sizeof(int) 与 sizeof(int*) 不同
Why is sizeof(int) different than sizeof(int*)?
我想知道为什么在下面的程序中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字节。
int
和int*
的大小完全取决于编译器和硬件。 如果您看到 int*
中使用了 8 个字节,则您可能拥有 64 位硬件,相当于每个指针 8 个字节。
希望这有帮助!
sizeof(char) == 1
没有其他保证(*)。
实际上,指针在 16 位系统上的大小为 2,在 32 位系统上为 4,在 64 位系统上为 8。
(*)请参阅詹姆斯·坎泽的评论。
指针的大小取决于系统、编译器和体系结构。在 32 位系统上,它通常是 32 位,而在 64 位系统上,它们通常是 64 位。
如果您尝试将指针存储到整数中以便以后再次恢复到指针中,则可以使用类型 intptr_t
,这是一个足够大的整数类型,可以容纳(我相信)普通(非函数)指针类型。
对于 32 位系统,"事实上"的标准是 ILP32 - 即 int, Long 和指针都是 32 位数量。
对于 64 位系统,主要的 Unix"事实上"标准是 LP64 - long 和指针是 64 位(但 int 是 32 位)。视窗 64 位 标准是 LLP64 - 长长和指针是 64 位(但长和整数 均为 32 位)。
曾经,一些Unix系统使用ILP64组织。
这些事实上的标准都没有由C标准立法。 (ISO/IEC 9899:1999),但所有这些都是它允许的。
和
如果您关心可移植性,或者您想要 类型反映大小,可以查看标题,其中 以下宏可用:
int8_t int16_t int32_t int64_t
int8_t
保证为 8 位,int16_t
保证为 16 位 位等。
看到这个问题。
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- 在 <char>sizeof(int) == 1 的平台中如何编码 char_traits::eof() ?
- 如何理解"vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?
- sizeof(int(123)) 是什么意思?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 如何解释sizeof(std::vector<int>)的值?
- 为什么sizeof int是错误的,而sizeof(int)是正确的
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- C/C++:在32位机器上的sizeof(short)、sizeof(int)、sizeof(long)、size of
- C/C++:包含 int 和枚举的 typedef 结构的大小 == sizeof(int)
- 为什么 sizeof(int) 与 sizeof(int*) 不同
- 如何理解"C++ allows sizeof(char*) != sizeof(int*)"?
- 在这种情况下,sizeof(int) 返回什么
- 在32位或64位平台上,sizeof(int)=1
- sizeof类,在C++中有int,function,virtual函数
- 将-1移位到sizeof(int)在C++中生成两个不同的结果
- sizeof(int)是否始终等于sizeof(void*)
- 为什么C#中的sizeof(int*)=8,C++中的sizeof[int*]=4
- 当sizeof(int)=sizeof(long)时,long优于int的任何情况