正确地影响stuct指针

时间:2017-08-09 09:14:02

标签: c

我有当前的结构

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

然后程序崩溃!
怎么了?

1 个答案:

答案 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++] = .......