Ref/DeRef список двухточечных ссылок

Я передаю связанный список, содержащий другой связанный список для функции, но у меня возникают проблемы с / ссылаются на внутренний связанный список из переданного двойного указателя. Ошибка компилятора здесь для строки push(*config->inner_linked_list... является '*config' is a pointer; did you mean to use '->', Внутри основной &config->inner_linked_list работает отлично. Я не могу понять, какой тип ref/deref мне нужно использовать здесь.

typedef struct new_inner {
    wchar_t setting[10];
    wchar_t val[10];
    struct new_inner  * next;
}INTLL_t ;

typedef struct new_head {
    wchar_t name[10];
    struct INTLL_t * inner_linked_list;
    struct new_head * next;
} HEAD_t;




// In Main
int main(){
...
    HEAD_t * config;
    config = malloc(sizeof(HEAD_t));
    config = NULL;

//config populated elsewhere

    functo1(&config);
...
}


BOOL functo1(HEAD_t ** config){
    HEAD_t * current = *config;
    while(current != NULL){

    INTLL_t * s = another_ll; // Also INTLL_t
    while(s != NULL){


    push(*config->inner_linked_list, another_ll->setting,another_ll->val);
            s = s->next;
    }

    current = current->next;
}

return TRUE;
}

2 ответа

Решение

Доступ к элементу через оператор указателя -> имеет более высокий приоритет, чем оператор разыменования *, поэтому, когда вы делаете *config->inner_linked_list, он пытается получить доступ к элементу двойного указателя HEAD_t, что приведет к ошибке. Это работает в основном, потому что там объект конфигурации является обычным указателем. Вам нужны скобки для правильного использования.

(* Конфигурация) -> inner_linked_list

http://en.cppreference.com/w/c/language/operator_precedence

    struct INTLL_t * inner_linked_list;

struct INTLL_t это неопределенный тип. Это не связано с INTLL_t (который является typedef, а не структурой). Вы, вероятно, имели в виду либо INTLL_t * или же struct new_inner * Вот.

    HEAD_t * config;
    config = malloc(sizeof(NODE_t));
    config = NULL;

Это утечка памяти. Вы только что потеряли единственный указатель на блок, возвращенный malloc, Также, NODE_t не определено. В любом случае, это должно быть config = malloc(sizeof (HEAD_t)) или (предпочтительно) config = malloc(sizeof *config),

BOOL functo1(HEAD_t ** config){

BOOL не определено.

    NODE_t * s = another_ll;

ни NODE_t ни another_ll определены.

    push(*config->inner_linked_list, another_ll->setting,another_ll->val);

push не определено.

config это указатель на указатель на структуру. *a->b разбирает как *(a->b), что требует a быть указателем на структуру, чья b член также является указателем (это эквивалентно *((*a).b)). Ты хочешь (*config)->inner_linked_list вместо (или эквивалентно (**config).inner_linked_list).

return TRUE;

TRUE не определено.

Другие вопросы по тегам