c - c中 union 的自由结构

标签 c struct dynamic-memory-allocation unions

我有一个特殊结构的动态分配 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/

相关文章:

c++ - 快速排序无限循环数值食谱

c - 在c中读取一个字符和一个数字

c++ - 在动态分配的结构中使用 std::string 时出现段错误

c++ - 如何设置一个元表以从另一个元表继承,同时将用户数据更改为另一种类型?

c - 分配和重新分配结构及其元素

c - 最早什么时候可以注册信号处理程序?

c - C中同一结构内的结构数组

c++ - 如何使用 STL (C++) 避免重新分配

c - C 中的动态缓冲区 fgets

c - 将字符串参数从 C 传递到 Fortran 子例程时出现问题