C链接列表/堆栈与无效数据成员问题

时间:2014-04-13 00:16:15

标签: c memory struct stack void-pointers

所以我正在玩堆栈并制作了一个通用的Stack.h文件和一个Stack.c文件,它们分别定义了列表及其功能,当我尝试它(stackdemo.c)时,它会在我弹出时崩溃列表。我尝试使用void **节点成员,对内存泄漏保持谨慎等等,但没有什么能让我超越它。我正在使用MinGW 32位gcc编译器和g ++来链接Windows 7,没有任何警告。

我有一种预感,每次调用NODE时我都可能需要重新分配push结构,因为数据成员在NODE结构之后被分配,但我没有&#39 ; t知道要分配多少字节。我假设NODE struct的malloc分配了两个指针变量,仅此而已。我不知道任何当前的内存泄漏。

//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 个答案:

答案 0 :(得分:0)

pop中的

:不需要以下行。

data = malloc(temp->size);

在推送:

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

应该是

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