博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于c语言的sizeof
阅读量:4047 次
发布时间:2019-05-25

本文共 685 字,大约阅读时间需要 2 分钟。

最近在看林锐博士的高质量c/c++编程指南,在书的后面附了一张测试的卷子,做了一下,发现自己很多都是处于半懂半不懂得阶段,比如下面这道关于sizeof的题目:

 

 

1void Func ( char str[100])

{

请计算

  sizeof( str ) =   4      2 分)

}

 

2char    str[100 ] = {0} ;

char   *p = str ;

int     n = 10;

请计算

sizeof (str ) =  100    2 分)          

sizeof ( p ) =   4    2 分)            

sizeof ( n ) =   4    2 分)

 

 

3void *p = malloc( 100 );

请计算

sizeof ( p ) =  4       2 分)

 

其实大部分还是很好理解的,但是对于1、和2中的第一小问我刚开始被纳闷到了,同样都是对数组的首地址取sizeof,怎么会两者截然不同,开始我还怀疑林锐博士的书出错了,自己编了个小程序果然如此,在网上查了一下资料,得到结果如下:

 

Char   str[100];  

sizeof是个编译器常量,当程序执行到这里的时候,编译器在编译阶段己经知道他的长度了,会把它的长度记录, sizeofC中的一个操作符,是语言层面的功能,这个计算结果是在编译时完成的,就是说编译器看到这个语句,它就会用100这个常数去替换,因此 生成的的汇编代码里有它的长度!  

 

当数组名作为参数传递时,会退化为指同类型的指针!  也就是说此事在1、中的str已经只是一个地址了,所以当然是4了,这也是为什么我们传递数组的时候除了给他首地址还要给它数组的大小的缘故。

 

 

转载地址:http://sokci.baihongyu.com/

你可能感兴趣的文章
opencv学习——在MFC中读取和显示图像
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
Java的对象驻留
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>