2015-02-07 3 views
0

Я новичок в C. Я пытаюсь создать структуру 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) 
+2

Попробуйте изменить 'reset_rem_info (&prem);' в 'reset_rem_info (прем);' Вам не нужно разыменования указателя – jpw

+0

это название «* доступ к структуре члена с использованием указателей *» вводит в заблуждение, поскольку речь идет. ** не ** о доступе к члену структуры **, но о доступе к ** целой ** структуре. – alk

+0

Согласен ...На самом деле код в одной точке необходим для доступа к члену структуры. Однако я был застрял до достижения этой точки. Тем не менее, спасибо за ваш ответ – bislinux

ответ

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

Так что ваш прототип функции остается неизменным.

+0

Хотя это и работает, это изменит интерфейс, предоставляемый функцией. Я сомневаюсь, что это то, что нужно OP. Также текущий код для функции завершится ошибкой. – alk

+0

@alk OP хочет избавиться от предупреждения о том, что делается внутри API - это то, что OP должен позаботиться. – Gopi

+0

Этот подход выглядит для меня как борьба с симфомами ... вроде программирования вуду ... sry. – alk

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

если вы хотите таНос Prem в reset_rem_info вы забыли * для ничтожной reset_rem_info (rem_info * Prem) затем разыменования это для bzero еще не т написать & в reset_rem_info(&prem);

+1

Из чего вы заключаете: «* to malloc prem в' reset_rem_info() '*"? – alk

+0

В вашем коде rem_info * теперь malloc, поэтому, когда вы его используете, он будет segfault. Поэтому вам нужно разделить его. Когда вы отправляете переменную в C, создайте копию, поэтому, если вы хотите malloc rem_info в reset_rem_info, вам нужно отправить ее адрес, если вы скопируете его, используя копию адреса, вы потеряете ее в конце функции. Поэтому, чтобы malloc его в reset_rem_info вам нужно отправить адрес и отправить rem_info ** prem и сделать * prem = malloc (sizeof (prem)); –

3

Глядя на главной функции :

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

    return 0; 
} 

Вы создаете указатель на rem_info и передаете его адрес reset_rem_info. Это означает, что вы передаете указатель на указатель на rem_info. Чтобы сделать это typecheck, вы можете передать указатель напрямую, не принимая его адрес.

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

Спасибо, ребята, за быстрые ответы ... Ответ 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; 
} 

Изменение избавились от предупреждений и сегментации свалка ...

ОГРОМНОЕ СПАСИБО GUYSSS

Смежные вопросы