c - 通过引用传递并将值赋给结构指针的指针

标签 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);

编译器没有任何提示,但是当运行我的代码时,我在函数 get_data(...) 的代码的最后一行出现“Bad access”,这是怎么回事?

最佳答案

由于您传递的是未初始化指针的地址,因此您还必须分配结构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();

关于c - 通过引用传递并将值赋给结构指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39572773/

相关文章:

c - 两段几乎相同的代码出错

javascript - 如何使对象方法成为 IIFE?

C: 函数接收到的字符串似乎总是有 4 个空格

javascript - 是否可以将这些相似的功能合并为一个功能?

运行少量线程时 CPU 使用率达到 100%

c - 加入多播组的所有端点都应该接收发送到该组的数据吗?

C++ 以独立于平台的方式序列化和压缩 vector<structs>

c - 具有可变大小数组的结构

c - 为什么返回一个未初始化的值被认为是未定义的行为?

c - C 中的结构继承限制