zoukankan      html  css  js  c++  java
  • 2015-10-20 关于struct和union

    1、结构体:

    1.1、思考题:空结构体占用多大内存空间?

    ANS:不同的编译器,这个结果是不定的。在GCC下,空结构体占用0个字节的空间。在G++编译器下,空结构体占用1个字节的空间。

    1.2、一个新的概念----柔性数组

    柔性数组:数组大小待定的数组。

    C语言中结构体的最后一个元素可以为一个大小未知的数组。于是可以利用该特性来产生柔性数组:

    struct _soft_array

    {

      int len;

      int array[];

    };

    此处有一个问题是需要注意的:sizeof(_soft_array) = 4;在柔性数组结构体的声明中“int array[]”只相当于一个占位符,编译器并不会为其分配空间。

    柔性数组的使用实例:

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

    在上述代码中我们首先定义了一个柔性数组的结构体类型,然后我们利用该类型创建了一个柔性数组结构体,我们在堆中为该柔性数组申请了内存空间。这里我们假设我们柔性数组的长度为10.所以我们申请空间的代码如下:

    (SoftArray *)malloc(sizeof(SoftArray)+sizeof(int)*10);

    数据在内存中存放的示意图如下:

     

    还要注意一点:由于我们是在堆中申请的内存空间,所以当我们使用结束之后,我们需要将空间释放。

    2、union关键字:

    2.1、struct和union的区别:struct中的每个域在内存中都独立分配空间,而union只分配最大域的空间,所有域都共享这个空间。

    2.2、union 的使用受系统大小端的影响:

    大端模式:

    小端模式:

    所以可以利用该特性来写一小代码来检查当前系统是大端模式还是小端模式:

    #include<stdio.h>
    #include<stdlib.h>
    
    int check_sys()
    {
     union 
     {
      int i;
      char c;
     }dat;
    
     dat.i=1;
     return dat.c==1;
    }
    
    void main()
    {
    printf("%d
    ",check_sys());
    getchar();
    }
    

     如果系统是小端模式的话,输出结果应该是为1,假如是为大端模式的话,输出结果应该为0。

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/wan0807/p/4895373.html
Copyright © 2011-2022 走看看