浅谈:sizeof关键字

一、sizeof的作用


  • Sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包括基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。

注意:
1.sizeof既是关键字,也是运算符哦!很多人会忽略它是运算符这一点。(在这里补充一下,sizeof是唯一一个以单词形式出现的运算符,实际上发挥的是单目运算符的作用)。
2.sizeof不是函数!可能大部分人知道sizeof不是函数,但是具体的原因有些模糊,在这里做以解释(例如:i=sizeof(int),这样的式子,很容易让人觉得sizeof是一个函数。假设它是一个函数,那么sizeof int这样的式子是不成立的,但实际上sizeof int这个式子是可以正常运行的,因此,sizeof绝对不可能是函数的)。

二、sizeof的注意问题

  • sizeof不能求void类型的长度,但可以求void类型的指针长度;
  • 用sizeof求字符串时,要加上末尾的’\0’;
  • sizeof不能求动态内存分配的大小;
  • sizeof不能对不完整的数组求长度,否则会编译出错;

    注意:此处的不完整主演是指二维包括二维以上的数组,例如:int arr[][10]这样的是可以求数组大小的,但是int arr[10][]这样的是不可以求的,编译会出错

  • 当表达式作为sizeof的操作数时,它返回的是表达式计算结果的类型大小,但是它不对表达式求值;
    例如:

#include<iostream>

using namespace std;

int main()

{

char ch = 1;

int num = 1;

int n1 = sizeof(ch + num);

int n2 = sizeof(ch = ch + num);

cout << "n1=" << n1 << endl;

cout << "n2=" << n2 << endl;

return 0;

}

运行结果:
n1=4
n2=1
原因是:由于默认类型转换的原因,表达式ch + num的计算结果类型为int,因此n1=4;而ch=ch + num的计算结果为char,虽然在计算ch + num时结果为int,当把结果赋给ch时又进行了类型转换,因此表达式的最终类型还是char,故n2=1。


  • sizeof可以对函数调用求大小,并且求得的大小等于返回类型(函数类型)的大小,但是不执行函数体;
  • sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和;(即:sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小)。

由于结构体的内存对齐原因,可以看我前面写的关于结构体内存对齐的博客

猜你喜欢

转载自blog.csdn.net/cherrydreamsover/article/details/81057899