Как остановить перезапись старой переменной в методе C? - PullRequest
0 голосов
/ 22 апреля 2019

Я объявляю структурный узел и создаю его экземпляр с некоторыми значениями в методе. Оператор print в методе add_map возвращает то же самое для обоих вызовов метода.

Я хочу, чтобы они указывали на различные области памяти и сохраняли выделенные значения.

Как я могу это исправить? Спасибо!

int main()
    // ... Ptr and ptr2 are two different buffers, st is the pointer 
    // to the hash table.

    add_map(ptr, st, n);
    add_map(ptr2, st, a);
    printf("%-d\n", buf_getint(ptr, st));
    printf("%-d\n", buf_getint(ptr2, st));    
}

// source file

void add_map(struct buf* bst, struct node** ptr, uint8_t val) {
    int8_t hash_val;
    hash_val = hash_str(bst);
    struct node* pt;
    pt = *(ptr + hash_val);
    while (pt != NULL) pt = pt->ptr;
    struct node new_item = {.val = val, .buf = *bst, .ptr = NULL};
    new_item.buf.pos = bst->pos;
    printf("\n%x\n", &new_item);
    *(ptr + hash_val) = &new_item;
}

1 Ответ

1 голос
/ 22 апреля 2019

В вашей функции add_map,

struct node new_item = {.val = val, .buf = *bst, .ptr = NULL};

- это локальная переменная, инициализированная стеком, которая выйдет из области видимости при выходе из функции (т. Е. Содержимое, на которое указывает указатель, станет бессмысленным).Вы должны использовать ручное управление памятью (malloc() / free()) для выделения вашей структуры внутри add_map.Если я правильно понял ваш вопрос, это также решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...