C言語とメモリ位置合わせ構造

構造

構造は、新しいデータ型、データ型C言語が大幅に拡大されました。

struct STU{
  int age;
  char name[15];
 };

 struct STU  a;   //结构体实例
 struct STU  *b;  //结构体指针

1は、年齢は問題があり、このため、B、a、b値を指すようにしましょうされた空間の構造が存在しなければならない> a.ageその操作部材によって撮影することができ、B->年齢も構造を動作させることができ、B-宇宙の構造体のアドレス。
2、a.name =「lilei」;偽、 名前は配列の名前であるため、ポインタ定数は、ソリューション割り当てることができません:strcpyの()関数
3、直接比較の文字列を、そして、それらのアドレスを比較することで、それはで、意味をなさない比較のためのstrcmp()関数は、ASCIIコードの比較です。

メモリ配置

メモリ空間、以下の原則を割り当てるためのオペレーティングシステム:スペースを割り当てるには、常に複数のアドレスのバイト2 ^ n個から開始します。
:図4(b)に従って、その空間分布パターン場合は起動し、第1アドレス番号から各変数(構造体)は、常に4バイトの整数倍です。
バイトアライメントは数として提供されてもよいです

#pragma pack(push)    //保持原对齐格式
#pragma pack(1)      //设定为n字节格式

 .......
 
#pragma pack(pop)     //恢复为原对齐格式

図1に示すように、構造体のサイズ
(1)は、合計サイズは、そうでなければ、単一のバイト(4/8の最大値に1バイトまで、最も広いの具体的な構成は、いくつかのバイトを参照)で充填された型の整数倍である
//合計サイズは、現行の前のバイトの合計数とバイト数、
(2)、構造体のサイズはバイトの最も広い整数倍である(典型的には4または8)
上記2つの条件なければならない(3)同時に設定します。最終結果が確立されていない場合、その後の整数倍に充填された
2次の例は、構造体のサイズを示し
、(1)

struct TEST{
    int a;
    short b;
    char c;
    struct TEST *next;
};

次のように:4 - > 2 - > 1(1バイトの補数) - > 4バイトの合計12
(2)、(1)の構造を借ります

struct TEST1{
  short d;
  int e;
  char f;
  struct TEST g;
  struct TEST1 *next;
  struct TEST h;
  char i;
};

次のように:2(S 2バイト) - > 4 - > 1(S 3バイト) - > 4> 12-(4文字までた、最も広い単一バイトを埋めるために、いっぱいにしたくないし)部分は、4つのバイトを有し、それが充填されていない- > 12-> 1。
合計:41バイト、構造体のサイズはバイトの最も広い単一整数であり、これは4の整数倍であるべきで、そして最後に、このサイズの構造が44バイトです。
(3)、(1)の構造を借ります

struct TEST2{
  short d;
  int e;
  double f;
  struct TEST1 *next;
  struct TEST g;
  char i;
};

次のように:2(S 2バイト) - > 4-> 8> 4(S 4バイト:現在の4バイトの前に16バイトの合計なので20のバイトではなく、次のデータタイプの合計(12) > 12-> 1 - 8バイトの整数倍とは、4つのバイトを構成する)の整数倍を構成することができる、最も広いあります。
37バイトの合計が、構造体のサイズはバイトの最も広い単一整数であり、これは8の整数倍であるべきで、この大きさの最終的な構造は40バイトです。
型構造が大幅にC言語を拡張し、データ型は、よりカラフルです。

おすすめ

転載: www.cnblogs.com/Hijack-you/p/11569549.html