通过引用传递&将值赋给struct指针的指针

时间:2016-09-19 12:06:05

标签: c function struct malloc pass-by-reference

我有一个结构MY_TYPE

struct MY_TYPE {
    boolean flag;
    short int xyz;
};

我有另一个结构MY_DATA,它有一个字段,指向上面结构的指针类型:

struct MY_DATA {
    MY_TYPE *m_type;
    double value;
};

我有一个函数,它将指针指向 MY_DATA作为参数:

getData(struct MY_DATA **m_data) {
    // create a MY_TYPE pointer & assign value to its field
    struct MY_TYPE *m_type_tmp = malloc(sizeof(struct MY_TYPE));
    m_type_tmp -> xyz = 123;

    // I try to assign a value to the MY_TYPE field of m_data,
    // there is no compiler error, but run time error "bad access"
    (** m_data).m_type = m_type_tmp;
}

我通过以下方式调用上述功能:

struct MY_DATA *data;
get_data(&data);

编译器没有任何抱怨,但是在运行我的代码时,我得到了“访问不良”#34;在函数get_data(...)的最后一行代码中,为什么会这样?

3 个答案:

答案 0 :(得分:3)

由于您传递了未初始化指针的地址,因此您还必须分配结构MY_DATA

void getData(struct MY_DATA **m_data) {
    // create a MY_TYPE pointer & assign value to its field
    struct MY_TYPE *m_type_tmp = malloc(sizeof(struct MY_TYPE));
    m_type_tmp->flag = 0;
    m_type_tmp->xyz = 123;

    // allocate the MY_DATA structure:
    *m_data = malloc(sizeof(*m_data));
    // Initialize all members
    (*m_data)->m_type = m_type_tmp;
    (*m_data)->value = 0;
}

让函数返回指向已分配结构的指针会更简单:

struct MY_DATA *getData(void) {
    // create a MY_TYPE pointer & assign value to its field
    struct MY_TYPE *m_type_tmp = malloc(sizeof(*m_type_tmp));
    m_type_tmp->flag = 0;
    m_type_tmp->xyz = 123;

    // allocate the MY_DATA structure:
    struct MY_DATA *m_data = malloc(sizeof(*m_data));
    // Initialize all members
    m_data->m_type = m_type_tmp;
    m_data->value = 0;
    return m_data;
}

以这种方式调用它:

struct MY_DATA *data = get_data();

答案 1 :(得分:1)

  

getData(struct MY_DATA ** m_data)

您不需要指针指向MY_DATA的指针,指向MY_DATA的指针就足够了。

然后代替(** m_data).m_type = m_type_tmp;你可以写:

m_data->m_type = m_type_tmp;

这些也是不正确的:

struct MY_DATA *data;  // <-- you haven't initialized the pointer
get_data(&data);

你可以通过以下方式解决这个问题:

struct MY_DATA data = {0};
get_data(&data);

答案 2 :(得分:0)

通过引用传递意味着您通过其他变量的引用传递值,而传递值意味着您传递的值为string,float,character或boolean。