gpt4 book ai didi

c - 如何为具有 char* 成员的结构分配内存

转载 作者:太空狗 更新时间:2023-10-29 16:09:11 25 4
gpt4 key购买 nike

我的结构看起来像这样:

struct tlv_msg
{
uint8_t datatype; //type of data
/* data stored in a union */
union{
int32_t s32val; /* int */
int64_t s64val; /* long long */
uint32_t u32val; /* unsigned int */
uint64_t u64val; /* unsigned long long */
char* strval; /* string */
unsigned char* binval; /* any binary data */
};

uint32_t bytelen; /* no. bytes of union/data part */
};

这个结构使用 union 来保存一些不同的数据类型。我有一个 alloc 函数,它为堆上的结构分配内存。我是否正确地认为,如果我为整数类型分配(即上面 union 中的前四种类型),我只需要按如下方式分配:

tlv_msg* msg = malloc(sizeof(tlv_msg));

sizeof(tlv_msg) 返回 24。我认为这足以容纳 union 中最大的数据类型以及其他数据成员。 (不确定为什么是 24 - 有人可以解释一下吗?)。

但是如果要存储的数据类型是指针类型,例如 char* 那么我还需要这样做:

msg->strval = (char*)malloc(sizeof(string_length+1);

这对我来说很有意义,而且似乎可行,但只是想检查一下。

最佳答案

完全正确。

也就是说,您可能想要创建辅助函数来帮助您处理这个问题。

例如:

tlv_msg * new_tlv_msg( void );

/* There, you need to free struct members, if applicable */
void delete_tlv_msg( tlv_msg * msg );

/* Here you may copy your string, allocating memory for it */
tlv_msg_set_strval( tlv_msg * msg, char * str );

实现可能是(当然是基本的)

tlv_msg * new_tlv_msg( void )
{
return calloc( sizeof( tlv_msg ), 1 );
}

void delete_tlv_msg( tlv_msg * msg )
{
if( msg->strval != NULL )
{
free( msg-strval );
}
free( msg );
}

tlv_msg_set_strval( tlv_msg * msg, char * str )
{
if( msg->strval != NULL )
{
free( msg-strval );
}
msg->strval = strdup( str );
}

关于c - 如何为具有 char* 成员的结构分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com