关于sizeof运算符的一些理解

作者:朱金灿

来源:http://www.cnblogs.com/clever101

 

     CSDN上有网友提问
复制代码
int *pArray_No1,*pArray_No2,a[]={1,2,3,4}; 
pArray_No1
=new int[10]; 
pArray_No2
=a; 
      cout 
< <sizeof(pArray_No1) < <endl        //结果为4 
    < <sizeof(pArray_No2) < <endl      //结果为4 
    < <sizeof(a) < <endl              //结果为16 
    < <sizeof(&a[0]) < <endl;          //结果为4 
delete [] pArray_No1;
复制代码

这段代码运行结果为44164
     
问(1)为什么pArray_No1初始化为指向10int型的内存地址块(我的理解没错吧?)
           
sizeof的运算结果只是1int型的字节大小,按理来说应该是10个啊,为什么呢?
     
问(2pArray_No2=a;说明pArray_No2指向了数组a首元素的地址,sizeof(pArray_No2)
            =4
,我理解为编译器只计算了数组a首元素地址的内存空间大小;但是问题出来了,a
代表的肯定是数组a首元素的地址,但是这里sizeof(a)=16,说明编译器计算的不是                   
一个首元素,而是整个数组4个元素的地址占的内存空间。我迷惑了,pArray_No2
a
代表的意义相同,但是为什么sizeof的结果却截然不同呢?

MSDN上的解释为:
The sizeof keyword gives the amount of storage, in bytes, associated with a
variable or a type (including aggregate types).
This keyword returns a value of type size_t.
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一
般定义为
typedef unsigned int size_t;

 

我觉得理解sizeof运算符的关键在于理解编译期和运行期的区别。静态的数组的大小在编译期就决定了,所以sizeof获取的是数组的大小,而指针动态开辟内存,sizeof不能获取它的开辟的内存的大小,它只能获取指针在该编译器的编译期的大小,在win32平台上无论什么指针的大小都是4个字节。你可以通过编译下面两段代码进行比较分析:


 

1


char a[10];
int b[sizeof(a)];


(2)
   int len = 10
   
int d[len];








posted @   是金子就会灿烂  阅读(402)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示