C Связанный список / стек с недействительными членами данных проблема

Поэтому я играл со стеками и создал общий файл Stack.h и файл Stack.c, которые определяют список и его функции соответственно, и когда я его пробую (stackdemo.c), он вылетает, когда я выхожу из списка. Я пытался с помощью void ** члены узла, проявляющие осторожность с утечками памяти и т. д., но ничто не помогает мне преодолеть это. Я использую MinGW 32-битный компилятор gcc и g++ для компоновки для Windows 7, не давая предупреждений.

У меня есть предчувствие, что мне, возможно, придется перераспределить NODE структурировать каждый раз push вызывается, потому что член данных выделяется после NODE Структура есть, но я не знаю, сколько байтов выделить. Я предполагаю, что маллок из NODE Структура выделяет две переменные-указатели и ничего более. Я не знаю ни о каких текущих утечках памяти.

//Stack.h

#ifndef STACK_H
#define STACK_H`
#include "string.h"

typedef struct _Node
{
    size_t size;
    void *data;
    struct _Node *next;
} NODE;
void push(NODE **head, void *data, size_t size);
void pop(NODE **head, void *data);
#endif

И stack.c

#include "Stack.h"
#include "stdlib.h"
#include "string.h"

void push(NODE **head, void *data,size_t size)
{
    NODE *temp = (NODE *)malloc(sizeof(NODE*));
    temp->size = size;
    temp->data = malloc(size);
    temp->next = *head;
    memcpy(temp->data,data,size);
    *head = temp;
}
void pop(NODE **head, void *data)
{
    NODE *temp = *head;
    if(temp)
    {
        data = malloc(temp->size);
        memcpy(data,temp->data,temp->size);
        *head = temp->next;
        free(temp->data);
        free(temp);
    }
}

Тестовая программа:

#include "Stack.h"
#include "stdio.h"
int main(int argc, char **argv)
{
    int n = 1;
    NODE *head = NULL;
    while(n)
    {
        printf("\nPlease enter a number to push or press -1 to pop, 0 to quit:\t");
        scanf("%d",&n);
        if(n > 0)
        {
            push(&head,&n,sizeof(int));
            printf("Pushed %d on the stack",n);
        }
        else if(n == -1)
        {
            int i;
            pop(&head,&i);
            printf("Popped %d from the stack",i);
        }
    }
}

Вылетает каждый раз, когда попадает в pop()

1 ответ

Решение

В pop: следующая строка не обязательна.

data = malloc(temp->size);

при нажатии:

NODE *temp = (NODE *)malloc(sizeof(NODE*));

должно быть

NODE *temp = (NODE *)malloc(sizeof(NODE));
Другие вопросы по тегам