C++中的sizeof运算符 - 指向double的指针

4

我在使用sizeof运算符(C++)时遇到了意外的结果。在主类中,我有以下几行代码:

 double * arguments_ = new double();
*arguments_  = 2.1;
*(arguments_+1) = 3.45;
 cout <<  (sizeof arguments_) << ' ' <<  (sizeof arguments_[0]) << ' '<< (sizeof arguments_)/(sizeof arguments_[0]);

这段代码输出结果为4 8 0

Double类型占用8个字节,而(arguments_[0])的大小为8。但是,为什么(arguments_)的大小没有以字节表示呢?(2*8 = 16)?sizeof运算符适用于数组吗?


1
是的,在您的计算机上,指针的大小为4个字节;指针的大小不取决于它所指向的内容。顺便问一下,以下划线结尾的变量名有什么特殊含义吗? - Mr Lister
2
请注意,*(arguments_+1) = 3.45 写入了未初始化的内存区域! - Gui13
我不知道这是否是“真正的”代码,但*(agruments+1)是“在您调用new double()分配的double之后的double。您正在写入未分配给您的变量。一切都可能发生,包括一切顺利进行,或者您的机器突然爆炸。” - Emilio Garavaglia
我认为你把指针的大小误认为是它所指向的数组的大小了。虽然在你的代码中,参数并不是指向数组的指针。 - Rubbish_Oh
可能是Is the sizeof(some pointer) always equal to four?的重复问题。 - Bo Persson
显示剩余2条评论
4个回答

6

这两个值使用相同的单位进行表示。你拥有一个32位系统,因此地址的大小为32比特,或者说4字节。在你的系统上,double类型的大小为8字节。当进行整型除法 4/8 时,结果为零。


2

因为当你对指针应用sizeof操作符时,无论它指向什么类型,你都会得到指针占用空间的大小。

在C++中,一个指针变量占用4个字节(在具有32位地址总线的架构上)。


1
顺便提一下,你应该像这样分配参数:double *arguments = new double[2],因为你在参数中放了2个双精度浮点数。 - Rubbish_Oh

2

(sizeof arguments_)的结果是指针的大小,即4个字节。


在C++中,指针大小始终为4个字节,无论它指向什么。 - Abhineet
1
在32位的C++中,这是正确的。在64位中,它是64,以此类推。除了平台差异外,你是正确的。 - ssube

1
你得到的是:
指针的大小为4字节
双精度浮点数的大小为8字节
4/8 = 0 (请记住 / 表示整数除法)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接