使用指针访问结构成员
我是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;
}
,如果你想的malloc炳在您忘记reset_rem_info为无效reset_rem_info(rem_info *炳)A *,然后取消对它的引用了bzero 别的唐吨编写&在reset_rem_info(&prem);
从什么结论:“*到'reset_rem_info()'*”中的malloc预处理? – alk 2015-02-07 17:11:53
在你的代码中,rem_info *现在是malloc,所以当你使用它时它会出现段错误。所以你需要malloc它。当你用C发送一个变量时,它会创建一个副本,所以如果你想将malloc rem_info复制到reset_rem_info中,你需要发送它的地址,如果你使用地址副本malloc,你会在函数结束时丢失它。因此,要将它置于reset_rem_info中,您必须发送地址并发送rem_info ** prem并创建* prem = malloc(sizeof(prem)); – 2015-02-07 17:21:02
你的主要功能展望:
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;
}
感谢球员的快速回复..加布里埃尔的回应给了我一个很好的见解。然而我坚持拉斐尔桑托斯的回应。 ......但是,如果加布里埃尔可能好心阐述点多一点,请...确定这里是固定的代码
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;
}
的变化摆脱了警告,并分割转储...
感谢一位全家伙
尝试更改'reset_rem_info(&prem);'''reset_rem_info(prem);'您不需要取消引用指针 – jpw 2015-02-07 17:07:56
此标题“*使用指针访问结构成员*”是误导性的,因为问题是**不**关于访问结构的**成员**,但关于访问**整个**结构 – alk 2015-02-07 17:16:56
我同意...实际上,需要在一个点上的代码来访问结构成员。但是在达到那个点之前我被卡住了。但是非常感谢您的回复 – bislinux 2015-02-07 17:41:08