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。

  • 相关阅读:
    多重继承的构造函数和析构函数的执行顺序(包含虚基类)
    java解析XML之DOM解析和SAX解析(包含CDATA的问题)
    java解析XML之DOM解析和SAX解析(包含CDATA的问题)
    计算机网络总结之运输层
    Method, apparatus, and system for speculative abort control mechanisms
    [转]如何用adb控制MTKLogger
    反转单向、双向链表
    删除链表中间节点和a/b处的节点
    Android 中log 找到关键log
    在单链表和双链表中删除倒数第k个结点
  • 原文地址:https://www.cnblogs.com/wan0807/p/4895373.html
Copyright © 2011-2022 走看看