2016-09-28 5 views
0

У меня есть союз объявил, как:Как передать член союза со ссылкой

typedef union { 
    mpls_vpls_t Vpls_dat; //typedef struct 
    mpls_vpws_t Vpws_dat; //typedef struct 
}ser_cache_t; 

и я выделить память для него:

ser_dat_ch = calloc(LABEL_T_CNT,sizeof(ser_cache_t)); 
if (ser_dat_ch == NULL) 
    return ERROR; 

в то время как static ser_cache_t *ser_dat_ch = NULL; глобальна.

Теперь я хочу, чтобы заполнить мой союз с данными и, следовательно, я wantto передать указатель на него к функции, как:
rv = switch_mpls_vpws_data_get(lab, &ser_dat_ch->Vpws_dat[lab]);
Но вот компилятор орет: выражение должно иметь указатель на объект типа почему так, не будет &ser_dat_ch->Vpws_dat[lab] решить по адресу, который я ищу?

+3

Что такое 'mpls_vpws_t'? Если это не массив typedef, вы, очевидно, не можете использовать 'Vpws_dat [lab]'. Возможно, вы имели в виду '& ser_dat_ch [lab] .Vpws_dat' –

+0

@ M.M Обе структуры являются' typedef struct' – cerr

+0

Вы не можете. C не поддерживает передачу по ссылке. Но вы можете передать указатель на союз (он же его адрес). См. [Ask], укажите [mcve]. Вы также хотите прочитать о преувеличении оператора. – Olaf

ответ

2

Я предполагаю, что у вас есть массив таких союзов и один указатель на начало этой памяти. Затем, доступ к одной из элемента структуры го элемента будет выглядеть

ser_dat_ch[i].Vpws_dat 

и указатель на этот союз является

&(ser_dat_ch[i]) 

и указатель на одной из структур в союзе (что, по-видимому, что вы ищете) is

&(ser_dat_ch[i].Vpws_dat) 
+0

Спасибо за открыватель! – cerr

0

Я не могу комментировать ваше сообщение (недостаточно репутации). Ошибка, которую вы получаете, обычно указывает, что параметр функции не является правильным типом для указателя. То есть передавая указатель на один размер указателя на несколько измерений.

Кроме того, ваш синтаксис является проблематичным:

rv = switch_mpls_vpws_data_get(lab, &ser_dat_ch->Vpws_dat[lab]); 

&set_dat_ch->Vpws_dat[lab] грязен синтаксис. Честно говоря, я даже не уверен, что будет оценивать сначала Vpws_dat[lab], затем ser_dat_ch->, а затем &. Вы должны просто упростить это (хотя через скобки вы можете получить желаемый эффект). Либо передать внутреннюю ser_dat_ch->Vpws_dat-структуру и получить переменную внутри функции, или до функции сделать что-то вроде:

int *var = ser_dat_ch->Vpws_dat 

А потом просто передать вар функции. Примечание. Я просто использовал int*, потому что я не уверен, что такое внутренняя реализация.

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