Полагаю, проблема в следующем:
Вы передаете 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
(хотя и не проверено).