Вопрос

Мне нужна помощь с указателями в C. У меня две структуры, сделанная такая, как это:

    typedef struct s{
        s2** d;
        struct s* next;
    }s;


 typedef struct s2{
        c* fi;
        struct s2* next;
    }s2;

И у меня есть такая функция, как эта:

void modify(c* a, s2* b){   //c* is a pointer to a struct
    s* rd = malloc(sizeof(s);
    rd->next = NULL;
    //need also to initialize the field "d" of the "s" struct
}

Это генерирует ошибку. Мне нужен структура RD, чтобы указывать на B, как в примере. Мне нужно сохранить двойной указатель, потому что S2 связаны с списком, похожим на списки, поэтому мне нужен указатель **, чтобы иметь возможность удалить первый элемент списка. Я выполнял задание в комментарии, например, rd-> d = & b, но когда я пытаюсь уважать поле «D» в функции, я читаю неверную память, и я не могу понять, почему.

Это было полезно?

Решение

Я полагаю, что проблема в следующем:

Вы проходите s2* b как аргумент modify, таким образом, этот указатель находится на стеке. Теперь, когда вы назначаете rd->d = &b, вы берете это место в стеке, которое будет действительным только до тех пор, пока выполнение не оставит область modify. Анкет Таким образом, когда вы остановитесь rd->d Позже вы получаете доступ к этому (ныне недействительному) местоположению в стеке, которое дает мусор или аварию. (Однако в этом сценарии вы должны быть в состоянии определить rd->d правильно, пока в modify.)

Наверное, вы бы хотели изменить, как b превращается в изменение, скорее всего, в что -то вроде s2** b, чтобы вы могли правильно передать указатель на указатель s2 в другой структуре вместо того, чтобы делать это указатель на s2 сидя на стеке для modify.

В основном нравится это:

void modify(c* a, s2** b) {
    s* rd = malloc(sizeof(s));
    rd->next = NULL;
    rd->d = b;
}

и назовите это как

s2* myS2 = ...;
modify(<whatever>, &myS2->next);

Это должно позволить вам передать местоположение указателя на s2 экземпляр, который вы можете сохранить и оставить даже после modify Заканчивается (не проверенный, хотя).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top