使用指针访问结构成员
accessing structure member using pointers
我是 C 的新手。我正在尝试在 main 之外创建一个 typedef
结构,然后创建一个 typedef
的指针。然后将这个指针传递给另一个函数。但是我收到错误。这让我发疯。非常感谢你..
typedef struct rem_info
{
char ufrag[80];
char pwd[80];
unsigned comp_cnt;
pj_sockaddr def_addr[PJ_ICE_MAX_COMP];
unsigned cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
} rem_info;
void reset_rem_info(rem_info *prem)
{
pj_bzero(prem, sizeof(rem_info));
}
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
错误:
*WARNING**:ex7.c:51:1: warning: passing argument 1 of ‘reset_rem_info’ from incompatible pointer type [enabled by default]
reset_rem_info(&prem);
^
ex7.c:41:6: note: expected ‘struct rem_info *’ but argument is of type ‘struct rem_info **’
void reset_rem_info(rem_info *prem)
void reset_rem_info(rem_info *prem)
这里的函数参数需要一个类型为 rem_info 的指针,而您传递的是指针的地址,因此类型不匹配,因此会出现警告。
你可以
void reset_rem_info(rem_info **prem)
确保初始化指针并将指针 prem
的地址传递给函数参数中指向指针的指针。如下图
int main()
{
rem_info *prem = malloc(sizeof(rem_info));
reset_rem_info(&rem_info);
}
或在调用函数时有
int main()
{
rem_info prem;
reset_rem_info(&prem);
}
这样你的函数原型就保持不变。
void reset_rem_info(rem_info **prem)
{
pj_bzero(*prem, sizeof(rem_info));
}
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
如果你想在 reset_rem_info 中 malloc prem 你忘记了一个 * for void reset_rem_info(rem_info *prem) 然后为 bzero 取消引用它
否则不要在reset_rem_info(&prem);
中写&
查看您的主要功能:
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
您正在创建指向 rem_info 的指针并将其地址传递给 reset_rem_info。这意味着您正在传递一个指向 rem_info 的指针。要进行类型检查,您可以直接传递指针而不获取其地址。
int main()
{
rem_info *prem;
reset_rem_info(prem);
return 0;
}
但这可能会给您带来错误。您现在正在处理指向 rem_info 的未初始化指针。您可能想要的是创建一个实际的 rem_info 并将其地址(指向 rem_info 的指针)传递给函数。
int main()
{
rem_info prem;
reset_rem_info(&prem);
return 0;
}
感谢大家的快速回复..Gabriel 的回复给了我很好的见解。但是我坚持拉斐尔桑托斯的回应。 ...但是,如果 Gabriel 可以详细说明这一点,请...好的,这是固定代码
typedef struct rem_info
{
char ufrag[80];
char pwd[80];
unsigned comp_cnt;
pj_sockaddr def_addr[PJ_ICE_MAX_COMP];
unsigned cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
}rem_info;
void reset_rem_info(rem_info *prem)
{
pj_bzero(prem, sizeof(rem_info));
}
int main()
{
rem_info prem;
reset_rem_info(&prem);
return 0;
}
更改消除了警告和分段转储...
非常感谢大家
我是 C 的新手。我正在尝试在 main 之外创建一个 typedef
结构,然后创建一个 typedef
的指针。然后将这个指针传递给另一个函数。但是我收到错误。这让我发疯。非常感谢你..
typedef struct rem_info
{
char ufrag[80];
char pwd[80];
unsigned comp_cnt;
pj_sockaddr def_addr[PJ_ICE_MAX_COMP];
unsigned cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
} rem_info;
void reset_rem_info(rem_info *prem)
{
pj_bzero(prem, sizeof(rem_info));
}
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
错误:
*WARNING**:ex7.c:51:1: warning: passing argument 1 of ‘reset_rem_info’ from incompatible pointer type [enabled by default]
reset_rem_info(&prem);
^
ex7.c:41:6: note: expected ‘struct rem_info *’ but argument is of type ‘struct rem_info **’
void reset_rem_info(rem_info *prem)
void reset_rem_info(rem_info *prem)
这里的函数参数需要一个类型为 rem_info 的指针,而您传递的是指针的地址,因此类型不匹配,因此会出现警告。
你可以
void reset_rem_info(rem_info **prem)
确保初始化指针并将指针 prem
的地址传递给函数参数中指向指针的指针。如下图
int main()
{
rem_info *prem = malloc(sizeof(rem_info));
reset_rem_info(&rem_info);
}
或在调用函数时有
int main()
{
rem_info prem;
reset_rem_info(&prem);
}
这样你的函数原型就保持不变。
void reset_rem_info(rem_info **prem)
{
pj_bzero(*prem, sizeof(rem_info));
}
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
如果你想在 reset_rem_info 中 malloc prem 你忘记了一个 * for void reset_rem_info(rem_info *prem) 然后为 bzero 取消引用它
否则不要在reset_rem_info(&prem);
查看您的主要功能:
int main()
{
rem_info *prem;
reset_rem_info(&prem);
return 0;
}
您正在创建指向 rem_info 的指针并将其地址传递给 reset_rem_info。这意味着您正在传递一个指向 rem_info 的指针。要进行类型检查,您可以直接传递指针而不获取其地址。
int main()
{
rem_info *prem;
reset_rem_info(prem);
return 0;
}
但这可能会给您带来错误。您现在正在处理指向 rem_info 的未初始化指针。您可能想要的是创建一个实际的 rem_info 并将其地址(指向 rem_info 的指针)传递给函数。
int main()
{
rem_info prem;
reset_rem_info(&prem);
return 0;
}
感谢大家的快速回复..Gabriel 的回复给了我很好的见解。但是我坚持拉斐尔桑托斯的回应。 ...但是,如果 Gabriel 可以详细说明这一点,请...好的,这是固定代码
typedef struct rem_info
{
char ufrag[80];
char pwd[80];
unsigned comp_cnt;
pj_sockaddr def_addr[PJ_ICE_MAX_COMP];
unsigned cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
}rem_info;
void reset_rem_info(rem_info *prem)
{
pj_bzero(prem, sizeof(rem_info));
}
int main()
{
rem_info prem;
reset_rem_info(&prem);
return 0;
}
更改消除了警告和分段转储...
非常感谢大家