通过引用传递并将值赋给结构指针的指针
pass by reference & assign value to a pointer of pointer of struct
我有一个结构 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",这是怎么回事?
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);
由于您传递的是未初始化指针的地址,因此您还必须分配结构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;
}
让函数 return 指向已分配结构的指针会更简单:
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();
通过引用传递意味着您通过其他变量的引用传递值,而通过值传递意味着您通过字符串、浮点数、字符或布尔值传递值。
我有一个结构 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",这是怎么回事?
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);
由于您传递的是未初始化指针的地址,因此您还必须分配结构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;
}
让函数 return 指向已分配结构的指针会更简单:
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();
通过引用传递意味着您通过其他变量的引用传递值,而通过值传递意味着您通过字符串、浮点数、字符或布尔值传递值。