您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-11 17:49 337 查看
                                                  

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

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

 
  
数据类型
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后面的(同类型是向上增长的),类型不一致后,另外起一段地址,是起低点的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: