2016-09-30 33 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數組。

通常你不能去進一步SECTOR1_OFFSET-1data指數,但它的工作(或者,如果你想讓它更清潔用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