我有当前的结构
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;
返回的值不为null,因为我可以正确记录它:
for (index = 0; index < checksumTablesResponse->n_entry; index ++) {
LOG("checksumTablesResponse->entry[index]->value);
}
将显示7个值:
3054867360
3054867360
379899191
4128997118
3185498542
1736976844
2545413521
然后程序崩溃!
怎么了?
答案 0 :(得分:2)
IMO你有UB,因为你没有分配任何内存,随机结果就像UB意味着 - 一切都可能发生
Protocol__ChecksumTable *checksumTablesResponse;
然后为结构和一些内容分配内存
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++] = .......