2016-09-30 10 views
0

データ配列と同じデータ配列へのポインタを含む構造体を定義します。そこで構造体を定義してから、ポインタを次のように初期化します。データ配列と同じデータ配列領域へのポインタを含む構造体を定義します。

typedef struct { 
    unsigned char data[MAX_PACKET_DATA]; 
    unsigned char* sector1; 
    unsigned char* sector2; 
    unsigned char* sector3; 
} Packet; 

[...] 

NGSCTransmittingDataPacket packet 

[...] 

packet->sector1 = packet.data + SECTOR1_OFFSET; 
packet->sector2 = packet.data + SECTOR2_OFFSET; 
packet->sector2 = packet.data + SECTOR3_OFFSET; 

typedef構造体定義の中でポインタを直接初期化できますか?私が書く場合

typedef struct { 
    unsigned char data[MAX_PACKET_DATA]; 
    unsigned char* sector1 = data + SECTOR1_OFFSET; 
    unsigned char* sector2 = data + SECTOR2_OFFSET; 
    unsigned char* sector3 = data + SECTOR3_OFFSET; 
} Packet; 

コンパイラは私にエラーを与えます。

答えて

3

あなたはそれを行うことはできませんが、Cは許可しません。しかし、あなたの例では、あなたがその同等行うことができます:

typedef struct { 
    unsigned char data[SECTOR1_OFFSET]; 
    unsigned char sector1[SECTOR2_OFFSET-SECTOR1_OFFSET]; 
    unsigned char sector2[SECTOR3_OFFSET-SECTOR2_OFFSET]; 
    unsigned char sector3[MAX_PACKET_DATA-SECTOR3_OFFSET]; 
} Packet; 

をすべてのメンバーがchar配列であるため、パディングはありません。

あなたがアクセスしている場合、一部のコンパイラは文句を言う可能性があるため、あなたが正常にdataのインデックスのための更なるSECTOR1_OFFSET-1に行くことはできませんが、それが動作する(またはあなたがそれをきれいにしたい場合はMAX_PACKET_DATA -length配列との結合を作成します大きなインデックスを持つdata)2つの匿名構造体の組合と

例:

#include <stdio.h> 

#define SECTOR1_OFFSET 20 
#define SECTOR2_OFFSET 50 
#define SECTOR3_OFFSET 80 
#define MAX_PACKET_DATA 100 

    typedef union 
    { 
    struct 
    {  
    unsigned char sector0[SECTOR1_OFFSET]; 
    unsigned char sector1[SECTOR2_OFFSET-SECTOR1_OFFSET]; 
    unsigned char sector2[SECTOR3_OFFSET-SECTOR2_OFFSET]; 
    unsigned char sector3[MAX_PACKET_DATA-SECTOR3_OFFSET]; 
    }; 
    struct 
    { 
     unsigned char data[MAX_PACKET_DATA]; 
    }; 
    } Packet; 

int main() 
{ 
    Packet p; 
    p.data[SECTOR3_OFFSET] = 'a'; 
    p.data[SECTOR3_OFFSET+1] = 'z'; 
    p.data[SECTOR3_OFFSET+2] = '\0'; 
    printf("sector 3 %s\n",p.sector3); 

return 0; 
} 

結果:

sector 3 az 
関連する問題