我有一个特殊结构的动态分配 vector ,我试图释放但软件总是崩溃
结构是:
typedef struct {
Type_e type;
union {
char m_char;
int m_int;
// more types (non of them is a pointer)
} my_data;
} Data_t;
其中 Type 是一个包含所有可能数据类型的枚举。
我按如下方式分配和初始化 vector
void vector(Data_t **vec, UInt32_t start_element, UInt32_t end_element, Type_e type)
{
UInt32_t i;
Data_t *vec_ptr;
*vec=(Data_t *)malloc((size_t) ((end_element-start_element+1) * sizeof(Data_t)));
vec_ptr = *vec;
if (!vec_ptr)
{
// Write error
}
for (i =start_element; i <= end_element + 1; i++)
{
vec_ptr->type = type;
switch (type)
{
case UINT32: vec_ptr->my_data.m_int = 0; break;
// more possible cases
default:
break;
}
(vec_ptr)++;
}
}
我这样调用这个函数
Data_t *lVector = NULL;
vector(&lVector,0,10,INT32)
但是当我尝试如下释放分配的内存时,
free (lVector+start_element-1);
我试过了
free (lVector+start_element);
和
free (lVector);
是 start_element = 0(在这种情况下)
但在所有情况下,它都会崩溃。我做错了什么吗?
最佳答案
这是不正确的:
*vec = *vec + sizeof(Data_t);
它将 *vec
推进 sizeof(Data_t)*sizeof(Data_t)
字节,因为指针算法将整数常量乘以 sizeof(*p)
自动。
替换为 (*vec)++
,让编译器为您计算。同样,在所有操作指针的地方删除乘法。代码中唯一需要乘以 sizeof
的地方是调用 malloc
时。
注意:您的代码很难阅读,因为您在循环中来回移动 *vec
。您最好声明并使用一个简单的临时指针来迭代 vector ,并将 *vec
固定为 malloc
分配的任何内容。
关于c - c中 union 的自由结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357650/