0
点赞
收藏
分享

微信扫一扫

License项目复盘20220314

small_Sun 2022-03-14 阅读 65

sizeof-获取某个数据类型所占用空间的字节数

sizeof操作符的结果类型是size_t,是C的一种单目操作符,类似++,–等,并不是函数。

sizeof可以用于数据类型、变量:如sizeof(int),sizeof (var_name)

sizeof的结果(常用)

  1. 若操作数具有类型char、unsigned char或signed char,其结果等于1

  2. int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。

intunsigned intshort intunsigned shortlong intunsigned longfloatdoublelong double
2222444810
  1. 当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。
  2. 当操作数具有数组类型时,其结果是数组的总字节数。
  3. 联合类型操作数的sizeof是其最大字节成员的字节数结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
    比如我的机器上,以下代码输出为16:

 int main()
 {
     typedef struct a
     {
        char b;
        double x;
     }a;
     printf("%d\n",sizeof(a));
     return 0;
 }

以下代码输出为8:

 int main()
 {
     typedef union a
     {
        char b;
        double x;
     }a;

     printf("%d\n",sizeof(a));
     return 0;
 }

sizeof的主要用途

  1. sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如
void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
  1. sizeof的另一个的主要用途是计算数组中元素的个数。例如:
void * memset(void * s,int c,sizeof(s)

易错

分析以下程序执行结果:

  #include   <iostream>  
  using   namespace   std;  
  void   main()  
  {  
      double   a[4]={0};  
      double   *b=new   double[4];  
      cout   <<   "sizeof(a)="   <<   sizeof(a)   <<   endl;  
      cout   <<   "sizeof(a)/sizeof(a[0])="   <<   sizeof(a)   /   sizeof(a[0])   <<   endl;  
      cout   <<   "sizeof(b)="   <<   sizeof(b)   <<   endl;  
      cout   <<   "sizeof(*b)="   <<   sizeof(*b)   <<   endl;  
      delete   []   b;  
  }  

很容易认为:
(1)中sizeof(a)计算的是地址值所占的字节数,但是这里是个特例:
(4)中
都说数组和指针具有等价性:

[]   =   malloc(new)   +   *

但实质上还是略有一点不同的.C/C++明确知道整个数组占内存的大小(在声明的时候[]中的参数算是数组类型的一部分),却不知道指针所指向的,用malloc(new)申请的整块内存的大小.所以sizeof(*b)得到的只会是一个double型的内存块的大小,却不是b所指向的整个内存块的大小.

sizeof(数组名)是取整个数组字节数
siezeof(a)/sizeof(a[0]) = 4//    用整个数组占内存的大小   除以   每个元素占内存的大小   便得到数组的元素个数
sizeof(b)=8   //   这个是指针类型的大小   指针都是8 
sizeof(*b)=8   //   这个是指针所指向的一个double型的内存块的大小 

存入读出-底层ascll码和输入输出格式关系

int main()
{
    int i = 33;
    /*
    (gdb) p/x i
    $1 = 0x21
    */
    char c = '!';
    /*
    (gdb) p/x c
    $1 = 0x21
    */
    
    printf("%d\n", i);//  33
    printf("%c\n", i);//   !
    return 0;
}
举报

相关推荐

0 条评论