указатель на указатели в c
-
27-10-2019 - |
Вопрос
Мне нужна помощь с указателями в 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
Заканчивается (не проверенный, хотя).