使用指针访问结构成员

时间:2015-02-07 17:05:04

标签: c pointers struct typedef

我是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)

4 个答案:

答案 0 :(得分:3)

查看您的主要功能:

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;
}

但那可能会给你一个bug。您现在正在处理一个未初始化的指向rem_info的指针。您可能想要的是创建一个实际的rem_info并将其地址(指向rem_info的指针)传递给该函数。

int main()
{
    rem_info prem;  
    reset_rem_info(&prem);

    return 0;
}

答案 1 :(得分:1)

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);
}

这样你的函数原型就会保持不变。

答案 2 :(得分: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;
}

此更改消除了警告和分段转储......

感谢很多人

答案 3 :(得分:-2)

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