zoukankan      html  css  js  c++  java
  • struct和union,enum分析

    空结构体占用的内存多大?

     1   struct d
     2   {
     3   
     4   };
     5   
     6   int main()
     7   
     8   {
     9  
    10    struct d d1;
    11  
    12    struct d d2;
    13  
    14    printf("%d,%0x
    ",sizeof(d1),&d1); //求内存大小,及结构体变量的地址
    15    printf("%d,%0x
    ",sizeof(d1),&d2);
    16  
    17  }

    不同的编译器,分配的大小不一样,一般取0个字节或1个字节。

    柔性数组:数组大小待定的数组,C语言中结构体最后一个元素可以是大小未知的数组,C语言中可以由结构体产生柔性数组:

    1 struct softarray
    2 
    3 {
    4 
    5   int len;
    6 
    7   int array[];
    8 
    9 };

    那么这个结构体的大小是多少?  最后的未知大小的数组处理为0个字节,所以说整个结构体变量的空间就是其他变量的空间之和。

     1 typedef struct _soft_array
     2 {
     3     int len;
     4     int array[];
     5 }SoftArray;
     6 
     7 int main()
     8 {  
     9     int i = 0;
    10     SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10);
    11     
    12     sa->len = 10;
    13     
    14     for(i=0; i<sa->len; i++)
    15     {
    16         sa->array[i] = i + 1;
    17     }
    18     
    19     for(i=0; i<sa->len; i++)
    20     {
    21         printf("%d
    ", sa->array[i]);   
    22     }
    23     
    24     free(sa);
    25     
    26     return 0;
    27 }

    struct中每个域都在内存中分配空间;union只分配最大域的空间,所有域共享这个空间;union受系统大小端的影响:
    大端模式:内存的高地址位存放数据的高字节

    小端模式:内存的低地址位存放数据的高字节

     1 union c
     2 
     3 {
     4 
     5   int i;
     6 
     7   char cc;
     8 
     9 }  // 分配最大域空间,即4个字节
    10 
    11 union c abc;
    12 
    13 c.i=1;
    14 
    15 printf("%d
    ",c.cc); //大端模式:0,小端模式:1

    enum:
    是一种自定义类型,默认的常量的值均为整数,且第一个常量取值为0(如果不指定),其后的每一个常量均是在该常量前一个常量前加1,enum类型的变量只能取离散的值:

     1 enum color 
     3 {
     5    green,
     7    red=2, 
     9    blue,
    11    black
    13 };
    14 enum color c =green;
    15 printf("%d
    ",c);  //0
    16 enum color c =blue;
    17 printf("%d
    ",c);  //3
    18 enum color c =black;
    19 printf("%d
    ",c); //4

    枚举类型和#define的区别:
    #define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量

    #define 宏常量美誉类型信息,enum是一种变量类型

    typedf:

    用来给一个已经存在的数据类型重命名,并没有产生新的类型,typedef重定义的类型不能进行unsigned和signed扩展。

    typedef与#define的区别:

    1 typedef char* path;
    2 path p1,p2;  //相当于char* p1,char* p2
    3 #define path char*;
    4 path p1,p2;  // 相当于 char * p1,char p2
    内在的趣味,表面的繁琐
  • 相关阅读:
    关于异常“The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine”的处理
    sqlserver怎么将查询出来的数据存到新的数据库表中
    如何使excel表格的内容自动添加前缀
    数据库中实现“替换功能”
    win7下安装sdks
    win7如何安装mircosoft SDKs
    如何从mysql中将数据导入到sqlserver
    Sql Server 查询多行并一行
    04-队列 Queue
    03-栈 Stack
  • 原文地址:https://www.cnblogs.com/data1213/p/4821237.html
Copyright © 2011-2022 走看看