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


  • 24
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C和C++语言基本数据类型大小是根据系统架构和编译器的不同而有所差异。在大多数系统上,以下是常见的C和C++的基本数据类型大小: 1. char:通常是一个字节大小,表示一个字符或小整数值。 2. short:通常是两个字节大小,表示一个短整数值。 3. int:通常是四个字节大小,表示一个整数值。 4. long:通常是四个字节或八个字节大小,表示一个长整数值。 5. long long:通常是八个字节大小,表示一个很长的整数值。 6. float:通常是四个字节大小,表示一个单精度浮点数值。 7. double:通常是八个字节大小,表示一个双精度浮点数值。 8. long double:通常是八个字节或更多字节大小,表示一个长双精度浮点数值。 9. bool:通常是一个字节大小,表示真值(true或false)。 需要注意的是,上述大小只是通常情况下的值,实际大小可能因为不同的系统和编译器而有所不同。此外,C和C++语言提供了一些限定符(如unsigned和signed)以及可变长度的数据类型(如数组和结构体),使得程序员能够更灵活地定义自己所需的数据类型大小。 ### 回答2: C语言基本数据类型大小是根据不同系统和编译器而有所差异的。一般来说,C语言基本数据类型大小可以使用sizeof关键字来获取。 在大多数系统,C语言基本数据类型大小通常为以下几种: 1. 字符型(char):通常用1个字节的内存空间。 2. 整型(int):通常用4个字节的内存空间。但是在一些特殊的嵌入式系统,int可能用2个字节或者更多的字节。 3. 短整型(short):通常用2个字节的内存空间。 4. 长整型(long):通常用4个字节的内存空间,但是在一些特殊的系统,long可能用8个字节。 5. 浮点型(float):通常用4个字节的内存空间。 6. 双精度浮点型(double):通常用8个字节的内存空间。 此外,还有一些其他的数据类型,如无符号整型(unsigned int),指针类型(pointer),枚举类型(enum)等,它们的大小也是根据不同的系统和编译器而有所差异的。 需要注意的是,这些数据类型大小只是一般情况下的约定,实际上还可能受到系统的位宽、编译器优化等因素的影响。因此,如果需要确切地知道某个系统这些数据类型大小,可以使用sizeof关键字进行查询。 ### 回答3: C语言基本数据类型大小取决于不同的编译器和不同的机器架构。基本数据类型大小是以字节为单位来表示。 一般而言,C语言基本数据类型大小如下: 1. char类型大小通常为1字节,即8位。 2. short类型大小通常为2字节,即16位。 3. int类型大小通常为4字节,即32位。 4. long类型大小通常为4或8字节,即32位或64位。 5. float类型大小通常为4字节,即32位。 6. double类型大小通常为8字节,即64位。 但是这只是一般情况下的大小,具体的大小可能因编译器和机器架构的不同而有所变化。在不同的编译器和不同的机器上,基本数据类型大小可能有所不同。因此,在编写程序时,应该尽量避免依赖特定的基本数据类型大小,而要使用C语言提供的宏定义来表示数据类型大小,比如"sizeof"关键字,以确保程序的可移植性和兼容性。 总之,C语言基本数据类型大小是以字节为单位来表示的,具体大小取决于编译器和机器架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值