C/C++中基本数据类型所占内存大小_c++各类型占用字节-程序员宅基地

技术标签: C/C++  数组指针  数据类型大小  指针数组  无符号类型  

                                                  

C/C++中基本数据类型所占内存大小


      C中不同数据类型所占的字节大小,在不同的操作系统和编译器下,是不同的,一般主要说gcc下,32位或64位系统的,红色部分是3264位系统不同的,做了个表如下:

 

  

数据类型

32

64

取值范围(32位)

char

1

1

-128~127

unsigned char(当byte使用) 

1

1

0~255

short int /short 

2

2

–32,768~32,767

unsigned  short  

2

2

0~65,535

int

4

4

-2,147,483,648~2,147,483,647

unsigned int

4

4

0~4,294,967,295

long int /long

4

8

–2,147,483,648~2,147,483,647

unsigned long

4

8

0~4,294,967,295

long long int/long long

8

8

-9,223,372,036,854,775,808

~9,223,372,036,854,775,807

指针 

4

8

 

float  

4

4

3.4E +/- 38 (7 digits)

double

8

8

1.7E +/- 308 (15 digits)


注意:    

    1. 求数组大小时,如果数组作为参数传递时,退化为指针,所以sizeof(arr)大小为该系统下指针的大小

    2. 对于C字符串,需要牢记C/C++中一个汉字占两个字节(Linux下3个字节)。

    3. 求struct 或者 class 的大小时候,除了基本的数据类型大小,特别要考虑的是字节对齐问题,如果是C++的还涉及虚函数的虚表问题,需要加上虚表指针的大小,关于内存对齐的问题在别的博客会详细写。

关于数组,数组指针,指针数组稍微提一下:

 

关于sizeof求数组大小的,用代码去gcc中验证了下,说明下:

数组指针,本质是指向数组的指针,不管是指向什么类型,几维数组,sizeof返回的都是指针的大小;

只有正常创建数组 int arr[10],int arr[10][10],这样sizeof(arr)求的是数组的大小,如下图代码中,fun函数中,sizeof(a)的大小为指针的大小,数组作为参数退化为指针。

如下图可以看到,gcc会警告,sizeof只会返回一个int 指针的值

 

 

如下图代码中,类似

  int(*p)[10];  //p是指向一维数组int [10]的指针

  int*p[10];   //p是一维的指针数组,数组的每个元素是指针

 

 

结果如下:

 

这里解释下,因为是 64位系统,所以指针的大小是8,这里a,j 是数组指针,然后d,f分别是一维数组,二维数组的指针,g,h也是,下面解释一波他们的区别。只有b,c是指针数组。

这里我除了输出他们的内存大小,还有指针的值也就是他们指向的地址。

 

这里可以看到,a,b,c,,d,e,f他们的地址,都是19335XXX,可以看出他们是在一块内存中,这就是局部变量在栈区分配内存的,而g,h是b470XX, 因为malloc是动态分配的,是在堆区分配的,所以是另外一块内存。而且b,c的地址差值是240,差的就是b数组的大小。

顺便提一下,栈区是向下增长的,可以验证下(以下纯属个人兴趣,看不同类型数组在栈区的起始地址):


 

四个数组的地址是连续的,且b和arr是向下增长的。

 

 

在看这里,将最后的二维数组arr2改成一维数组后,arr2的地址是接在arr后面的(同类型是向上增长的),类型不一致后,另外起一段地址,是起低点的地址。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zcyzsy/article/details/77935651

智能推荐

计算机发展的几个重要事件,15件在计算机发展史中具有里程碑意义的事件-程序员宅基地

文章浏览阅读3.2k次。共15张图片,发表于2010-01-28 09:52:05据《时代》报道从1946年第一台电子计算机问世到苹果即将发布万众期待的平板电脑,现代电子计算机技术获得了长足的发展,这些发展均离不开人类科技知识的积累,离不开众多热衷于此并呕心沥血。1946年,第一台电子计算机“埃尼阿克”问世。第一台电子计算机叫“埃尼阿克”(ENIAC),它于1946年2月15日在美国宾夕法尼亚大学宣告诞生。承担开发任务的..._我国计算机发展的重要事件

踏上架构之路(二)——系统技术架构的演变-程序员宅基地

文章浏览阅读289次。"Believe it or not, the bigger problem isn't scaling, it's getting to the point where you have to scale. Without the first problem you won't have the second."—— 《Getting Real -The smarter, faster..._后台技术架构演进

MITK通用插件(三)The Properties View_mitk插件-程序员宅基地

文章浏览阅读249次。概述使用该插件可以对选择的数据及其关联数据属性进行查看和修改。该插件只针对高级用户和开发者进行开放。它是对后端的完全公开。使用属性列表类型两种属性列表:数据节点属性列表 和 数据属性列表数据节点属性列表主要包含渲染设置。它们不是实际数据的本质部分,仅在保存MITK场景作为一个整体时才被保存。这类属性的典型例子是“可见”,它决定是呈现数据还是隐藏数据。通用数据节点属性列表应用于所有的渲染窗口,但也有特定于渲染窗口的数据节点属性列表。在公共列表和特定于渲染窗口的列表中找到的任何属性._mitk插件

SuperMap iObjects .NET之二维线转三维线_超图iobjact geometry转dataset-程序员宅基地

文章浏览阅读892次。在超图的桌面产品中,包含了多种功能,其中也包括数据的基本处理功能。但是在各位伙伴在SuperMap iObjects .NET的使用过程中,也有二维转三维的需求,以下笔者就以二维线转三维线为例,详解这个过程。实现原理:1、创建三维线数据集(DatasetVector)2、获取二维线和三维线记录集(Recordset)3、使用二维线数据集记录集获取对象的节点,在使用对应的高度与二维节点一起组成三维点组4、使用三维点构造三维线对象,将对象存入新建的三维线数据集中具体实现方式:创建_超图iobjact geometry转dataset

maya2020 redshift3.0.31demo版安装方法。_redshift2.6.48demo版本-程序员宅基地

文章浏览阅读3.6k次。redshift官方提供的demo版测试仅仅提供到2.6.53,但水印,但是可以支持maya2020,学习功能足够了。如果要商用建议可以购买正版3.0以上版本,支持最新的rtx显卡。安装时,到了最后配置maya.env文件时,报错提示:Modifying C:\Users\Administrator\Documents\maya\2020-x64\maya.env …Failed to write to C:\Users\Administrator.5X10AWXGBWXZEXG\Documents\_redshift2.6.48demo版本

Vue button 的 @click 方法无效 钩子函数没有执行_button @click-程序员宅基地

文章浏览阅读1.2w次。Vue项目中使用button绑定click事件,事件无法触发methods中的方法解决办法事故还原小胖做完公司的项目,老大看着小胖疲惫的脸庞,有点心疼小胖,就给小胖放了三天假,没有给小胖新的需求。小胖平常主要是写的后端,但是最近跟小顺子有点聊技术,小顺子经常把Vue挂在嘴边,小胖有点不服气,正好最近也有时间,打算利用这三天把Vue入个门,但是刚开始就把小胖给难住了,小胖写了一个button,并绑定了click点击事件,但是发现无法触发methods中的but方法,异常提示信息大致的意思是but_aja_button @click

随便推点

CDH激活分发parcel时因为意外错误卡住不能修改问题解决方案_cdh parcel激活一直卡住-程序员宅基地

文章浏览阅读2.7k次。问题背景:今天因为业务需求需要在CDH集群上安装StreamSets,结果因为权限的原因,之前我把这个parcel文件的权限变更为cloudera-scm,结果后面遇到这个问题了,问了之前部署CDH的人才知道他那时候用的权限是Root用户,所以现在卡在这里,也没有地方可以直接暂停:然后我点进去看详细的信息:可以看到cluster2-1这个结点因为权限的问题,导致不能激活。解决方案:Cloudera并没有在控制台开发Cancel或者回滚的入口,此时服务状态就是卡住页面无法操作。通过_cdh parcel激活一直卡住

TinyRayTracer 用256行C++代码构建一个可理解的光线追踪器(1)_understandable raytracing in 256 lines of bare c++-程序员宅基地

文章浏览阅读1.6k次,点赞7次,收藏13次。网上有大量的光线追踪相关的文章,然而问题在于几乎所有的这些文章都在展示那些成熟的非常难以理解程序。举个例子,非常著名的 明信片光线追踪器 挑战。这段简洁的程序令人印象深刻,但却很难让人理解它是怎么工作的。我想详细地教你怎样实现,而不是向你展示我能完成图像渲染。_understandable raytracing in 256 lines of bare c++

C#实现多个子窗体切换效果_c#多窗体管理-程序员宅基地

文章浏览阅读3.1w次,点赞142次,收藏472次。Hello,大家好!我是灰小猿!今天来和大家分享一下在C#的winform开发中如何实现借助一个主窗体来实现内部多个子窗体的切换效果。多窗体切换首先来看一下主窗体中多个小窗体切换的效果:多窗体切换的原理:多窗体切换的原理其实是借助一个panel容器,在该容器中显示相同大小的窗口,接下来大灰狼和大家分享一下建立多窗口切换的步骤:1、新建一个主窗体并在其中放置适当的控件,包括进行切换的按钮和显示窗体的panel容器,在这里要注意:将要显示的子窗体就是在该panel容器中显..._c#多窗体管理

【Pycharm学习】Pycharm中输出问题,Pycharm运行程序时在Python console窗口中输出_在pycharm 软件内,输出歌曲信息在控制台打印-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。问题描述pycharm是一款很好用的IDE,但是有一些细节问题需要我们注意。作者就层遇到很多坑最近遇到的一个问题就是输出问题,虽然不影响输出结果但就是看起来不顺眼,现在我将问题,描述如下这就是遇到的问题输出不在正常的run中,直接输出到控制台了也不知道怎么搞的,查阅相关资料后下面说一下解决方案直接上图:1、点击框出来的这里进去页面2、最后一步把这个框起来的对号去掉就好了。..._在pycharm 软件内,输出歌曲信息在控制台打印

php配置vscode插件及环境_phpvcode-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏13次。Visual Studio Code(VS code)你们都在用吗?看了这篇博文或许对你有用。。。1、vscode 特点:开源,免费;自定义配置集成git智能提示强大支持各种文件格式(html/jade/css/less/sass/xml)调试功能强大各种方便的快捷键强大的插件扩展2、官网Visual Studio Code(VScode )官网 :https://..._phpvcode

碰撞检测:判断2个多边形相交_多边形碰撞交点-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏54次。演示demo:需要判断2个条件边相交。2个多边形的边是否相交。点在内部。2个多边形的顶点是否在另一个多边形的内部。关于这2个条件的判断:《碰撞检测:判断点是否在多边形内部》https://blog.csdn.net/StevenKyleLee/article/details/88044589《碰撞检测:判断线段相交》https://blog.csdn.net/StevenKy..._多边形碰撞交点