Структура, содержащая два двойных указателя, ошибки seg при доступе ко второму двойному указателю

Я пытаюсь получить доступ ко второму двойному указателю, но он немедленно выдает ошибку только после доступа к первому. Что здесь происходит?

Кажется, он работает без второго двойного указателя, но я понятия не имею, почему.

#include<stdio.h>
#include<stdlib.h>

struct queue{
    int ** x;
    int ** y;
};

struct queue funct1(){
    struct queue me;
    int * x = malloc(sizeof(int));
    int * y = malloc(sizeof(int));

    *x = 20;
    *y = 40;
    me.x = &x; 
    me.y = &y;
    return me;
}


int main(void){
    struct queue hello;

    hello = funct1();

    printf("%d\n", *(*(hello.x)));
    printf("%d\n", *(*(hello.y)));
}

Ожидается: 20 40

Факт: 20 Ошибка сегментации: 11

РЕДАКТИРОВАТЬ:

Это все еще не работает. Я добавил этот код в функцию:

    int ** xpointer = malloc(sizeof(int*));
    int ** ypointer = malloc(sizeof(int*));

    *x = 20;
    *y = 40;
    xpointer = &x;
    ypointer = &y;

    me.x = xpointer; 
    me.y = ypointer;

РЕДАКТИРОВАТЬ 2: Кажется, это работает.

struct queue funct1(){
    struct queue me;
    int * x = malloc(sizeof(int));
    int * y = malloc(sizeof(int));

    int ** xpointer = malloc(sizeof(int*));
    int ** ypointer = malloc(sizeof(int*));

    *x = 20;
    *y = 40;
    *xpointer = x;
    *ypointer = y;

    me.x = xpointer; 
    me.y = ypointer;

    return me;
}

person Work_Work    schedule 20.10.2019    source источник
comment
Не могли бы вы объяснить цель использования двойного указателя?   -  person Karl Knechtel    schedule 20.10.2019
comment
Спецификации присваивания говорят нам возвращать структуру, содержащую переменную-указатель и двойной указатель.   -  person Work_Work    schedule 20.10.2019


Ответы (1)


Указатели на локальные переменные функции больше недействительны после выхода из функции, но ваша функция funct1 сохраняет такие указатели в местах, где они будут использоваться позже. В частности, невозможно получить доступ к *(hello.x) и *(hello.y) после возврата funct1, и только по совпадению первый работает.

person Joseph Sible-Reinstate Monica    schedule 20.10.2019
comment
Есть ли какое-нибудь решение по этому поводу? Должен ли я malloc(sizeof(int *)), чтобы я мог правильно вернуть структуру? - person Work_Work; 20.10.2019
comment
Это потому, что вы на самом деле не используете то, что вы malloc; вы сразу же пропускаете его, а затем снова используете локальный. - person Joseph Sible-Reinstate Monica; 20.10.2019
comment
Можете ли вы порекомендовать мне хорошие ресурсы, чтобы окончательно понять указатели в C? Я работаю на C уже некоторое время, и меня расстраивает то, что я все еще нахожу двойные указатели запутанными. - person Work_Work; 20.10.2019
comment
@Work_Work К сожалению, такие рекомендации здесь не по теме. - person Joseph Sible-Reinstate Monica; 20.10.2019