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后面的(同类型是向上增长的),类型不一致后,另外起一段地址,是起低点的地址。


猜你喜欢

转载自blog.csdn.net/zcyzsy/article/details/77935651