Значение вне функции не совпадает с внутренней функцией, C
Пожалуйста, у меня проблема, и мне нужна помощь.
Получил структуру (стек):
struct sAddress {
tBSTNodePtr *data;
struct sAddress *pointer_next;
}*ads_stack;
тогда у меня есть функция PUSH
void pushAds(tBSTNodePtr hodnota)
{
struct sAddress *temp;
temp = (struct sAddress*)malloc(sizeof(struct sAddress));
temp->data = &hodnota;
if (ads_stack == NULL) {
ads_stack = temp;
ads_stack->pointer_next = NULL;
}
else {
temp->pointer_next = ads_stack;
ads_stack = temp;
}
printf("PUSH ADS KEY: %s\n", ads_stack->data->Key->str);
}
Когда я что-то нажимаю (в tBSTNodePtr
конечно) он напечатает значение Key->str
должным образом. Но когда я пытаюсь напечатать то же самое вне функции, вот так:
printf("STACK DATA: %s\n", ads_stack->data->Key->str);
Это даст мне segfault (пробовал на Win 8.1 под кодовыми блоками и под Fedora используя makefile). Что я делаю не так? Указатели не правы? ads_stack
не NULL вне функции нажатия.
2 ответа
Проблема в том, что
temp->data = &hodnota;
ссылается на адрес локальной переменной hodnota (который является полученным параметром).
Не могли бы вы объяснить, что такое tBSTNodePtr?
temp->data
это tBSTNodePtr *
и в вашей функции вы получаете tBSTNodePtr
не tBSTNodePtr *
, если вы используете &hodnota
вы будете ссылаться на адрес локального параметра, когда вы покидаете свою функцию, она выходит за пределы области видимости, эта переменная больше не существует.
Вам следует:
- Передать указатель на
tBSTNodePtr
- создать копию
hodnota
внутри вашей функции
Но, может быть, все зависит от того, что tBSTNodePtr
если это указатель на BSTNode, то, вероятно, вам следует изменить другие вещи. Возможно, изменив структуру, удалив *
в данных и изменения temp->data = &hodnota;
в temp->data = hodnota;
Как примечание стороны:
temp = (struct sAddress*)malloc(sizeof(struct sAddress));
Актерский состав struct sAddress *
не обязательно в C. Вы можете избежать этого. Может быть что-то вроде:
temp = malloc(sizeof *temp);
выглядит лучше.
Замещать void pushAds(tBSTNodePtr hodnota)
по пустоте pushAds(tBSTNodePtr *hodnota)
если вы хотите использовать hodnota struct
читать параметр в вашей основной функции
но если вы хотите изменить hodnota struct
Вы должны использовать пустоту pushAds(tBSTNodePtr **hodnota)
а затем заменить temp->data = &hodnota;
от temp->data = *hodnota;