2014-04-15 35 views
0

我的結構數據類型,秩序結構

typedef struct { 
    uint16 a; 
    uint16 b; 
    uint8 c[8]; 
    uint8 d; 
    uint8 e; 
}subset_t; 

typedef struct node{ 
    subset_t list; 
    struct node *link; 
}all_list 

添加列表後,我展示。例如添加元素是:

a = 112, b = 341, c = AB321EF6, d = 1, e = 2. 

如果我顯示,每一件事情是除了c細:它顯示AB321EF61N

但是,如果我改變結構:

typedef struct { 
     uint16 a; 
     uint16 b; 
     uint8 d; 
     uint8 e; 
     uint8 c[8]; 
    }subset_t; 

然後我得到確切的結果。據我所知,應該先給出更高的數據類型。有人告訴爲什麼數組應該是最後一個。

+0

數組絕對不*必須*最後一個。你能提供顯示這些結果的[Minimal,** Complete **和Verifiable示例](http://stackoverflow.com/help/mcve)嗎? – Dukeling

+0

您不能指望將8個字符和一個終止空字節存儲到結構的'char c [8];'成員中。 –

回答

1

您應該顯示更多代碼。

我猜你所得到的「奇怪」結果是因爲你正在碰到未定義的行爲。

由於字符串不合適,因此不能在「​​」中存儲「AB321EF6」,因此沒有空間用於終結符。因此,您的打印在c的末尾運行,並且根據結構的其他內存佈局可能會或可能不會遇到終結器。這是未定義的行爲。

2

這不是數組需要最後一個,而是你需要在你的數組上使用一個NULL終止符,如果你想能夠以字符串形式打印出來(使用格式說明符%s)。將c重新定義爲uint8 c[9],並將最後一個元素(c[8])設置爲0.

+0

或使用'「%.8s」'將打印限制爲前8個字符。但是你說的正確的是,該字符串不是空終止的(並且不能用'char c [8]'字段來保存8個字符,我認爲它對'c'有效,對'd'如果代碼分配1到'd',然後將該字符串複製到'c'('d'將看起來是0而不是1)。 –