Указатель на связанный список случайно меняется - PullRequest
0 голосов
/ 28 декабря 2018

Для одного из моих школьных заданий я должен сделать свою собственную библиотеку стека и калькулятор POSTFIX.Калькулятор должен использовать библиотеку стеков и выполнять некоторые вычисления.

Я помещаю два разных числа в свой стек.Номер 6 и 3. Заголовок должен указывать на последний добавленный узел (LIFO).Поэтому при добавлении 6:

HEADER -> 6 -> NULL

Когда добавляется 3:

HEADER -> 3-> 6 -> NULL

Когда я печатаю значение моего заголовка после добавления '6', это хорошо.Это печать 6. Однако, когда я печатаю значение моего заголовка ДО добавления '3', это печатает '3'.Когда он все еще должен вывести 6.

Итак, краткое изложение моей проблемы: при добавлении другого узла в мой связанный список заголовок внезапно указывает на самый новый узел, даже не меняя его.

Вы можете понятьмне лучше с некоторым кодом и результатами отладки.Кстати: не возражайте против typedefs, они мне не нравятся.Мой учитель хочет, чтобы мы его использовали.

typedef struct stackObject* pStackObject_t;
typedef struct stackObject
{
    void* obj;
    pStackObject_t next;
} StackObject_t;

typedef struct stackMEta* pStackMeta_t;
typedef struct stackMEta
{
    pStackObject_t stack;
    size_t objsize;
    int numelem; //number of elements
    int handle; //welke stack
    pStackMeta_t next;
} StackMeta_t;

int mystack_push(int handle, void* obj)
{
**DELETED NON RELATED CODE BASED ON FEEDBACK**
    if (currentMeta->handle == handle)
    {
        pStackObject_t newObject = malloc(sizeof(StackObject_t));
        newObject->obj = obj;
        printf("%s%d\n", "Wanting to push int to stack:  ", *(int*)obj);

        //First node
        if (currentMeta->stack == NULL)
        {
            currentMeta->stack = newObject;
            currentMeta->stack->next = NULL;
            printf("%s%d\n", " FIRST Curentmeta->stack pointing to  ", *(int*)currentMeta->stack->obj);
            return 0;
        }
        else
        {
            printf("%s%d\n", "NOT FIRST Currentmeta->stack pointing to ", *(int*)currentMeta->stack->obj);
            newObject->next = currentMeta->stack;
            currentMeta->stack = newObject;
            printf("%s%d\n", "Currentmeta->stack ", *(int*)currentMeta->stack->obj);
            printf("%s%d\n", "Currentmeta->stack->next ", *(int*)currentMeta->stack->next->obj);
            printf("%s%d\n", "Succesful pushed int to stack:  ", *(int*)currentMeta->stack->obj);
            return 0;
        }
    }
return -1;
}

Terminal:

Created stack with handle: 1 and objsize 4 bytes
Wanting to push int to stack:  6
FIRST Curentmeta->stack pointing to  6
Wanting to push int to stack:  3
NOT FIRST Currentmeta->stack pointing to 3
Currentmeta->stack 3
Currentmeta->stack->next 3
Succesful pushed int to stack:  3

Мои модульные тесты работают хорошо с этим кодом.Мой калькулятор не работает, хотя это тот же самый вызов функции.

1 Ответ

0 голосов
/ 29 декабря 2018

Я узнал, что это работает 50/50.Использование тех же значений ввода в другой программе привело к хорошим результатам.

Я изменил код так:

 pStackObject_t newObject = malloc(sizeof(StackObject_t));
 newObject->obj = malloc(sizeof(currentMeta->objsize));
 memcpy(newObject->obj, obj, currentMeta->objsize);

Теперь все работает нормально.В предыдущем коде каким-то образом использовались старые значения, хотя он уже был вне области видимости.Спасибо всем за помощь.

...