2017-08-09 51 views
0

我目前的結構正確影響stuct指針的值

struct Protocol__ChecksumTable 
{ 
    ProtobufCMessage base; 
    uint32_t tableindex; 
    size_t n_entry; 
    Protocol__ChecksumEntry **entry; 
}; 

struct Protocol__ChecksumEntry 
{ 
    ProtobufCMessage base; 
    uint32_t index; 
    uint32_t value; 
}; 

現在我宣佈Protocol__ChecksumTable*結構由函數填充它返回一個Protocol__ChecksumTable*

Protocol__ChecksumTable * 
    protocol__checksum_tables_response__unpack(void); 

... 

Protocol__ChecksumTable * checksumTablesResponse; 
checksumTablesResponse = protocol__checksum_tables_response__unpack(); 

現在我想修改Protocol__ChecksumEntry上的字段條目如下:

checksumTablesResponse->entry[0]->value = value; 

返回的值不爲空,因爲我可以正確地記錄它:

for (index = 0; index < checksumTablesResponse->n_entry; index ++) { 
    LOG("checksumTablesResponse->entry[index]->value); 
} 

7值將顯示:

3054867360 
3054867360 
379899191 
4128997118 
3185498542 
1736976844 
2545413521 

但隨後的程序崩潰!
有什麼問題?

+0

** 1 **'checksumTablesResponse'是一個指針,是不是'NULL'? ** 2。**'(...) - > entry'是一個數組,它的大小是否至少爲1? ** 3。**'(...) - > entry [0]'是一個指針,它不是'NULL'嗎? –

+0

是(不)你錯過了'typedef'的幾個,至少? –

+0

@AndreKampling我更新了問題 – mikmak

回答

2

IMO你有瑞銀你不分配任何內存,而你隨機結果爲UB手段 - 一切都可能發生

Protocol__ChecksumTable *checksumTablesResponse; 

然後ALLOC的結構和inits

checksumTablesResponse = malloc(sizeof Protocol__ChecksumTable); 
checksumTablesResponse -> entry = NULL; 
checksumTablesResponse -> n_entry = 0; 
內存部分

當您添加進入

checksumTablesResponse -> entry = realloc(checksumTablesResponse -> entry, sizeof(Protocol__ChecksumEntry *) * (checksumTablesResponse -> n_entry + 1); 

,那麼你可以添加條目

checksumTablesResponse -> entry[checksumTablesResponse -> n_entry++] = .......