Значение вне функции не совпадает с внутренней функцией, 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;

Другие вопросы по тегам