在没有seg错误的struct中使用指针

时间:2014-05-20 20:52:02

标签: c pointers struct

我试图使用指针来动态分配这个结构的数据。

struct Stack
{
    int top;
    ItemT *items;
    int size;
};

StackP newStack()
{
    struct Stack s;
    StackP p = &s;

    p->top = -1;
    p->items = malloc(sizeof(ItemT) * DEFAULT_CAPACITY);
    p->size = DEFAULT_CAPACITY;

    return p;
}

void pushStack(StackP p, ItemT i)
{
    p->top++;
    p->size--;
    p->items[p->top] = i;
}

我必须使用一个数组,它通过指针与struct分离,这样我就可以扩展它而不必扩展struct。当我运行pushStack()的测试时,我得到一个seg错误。我已经确定了这一行" p->items[p->top] = i"成为问题,但我不知道为什么。我怀疑在我的构造函数中分配的内存可能无法从其他函数中访问。首先,为什么我会遇到段故障?其次,我该如何解决这个问题? (这些函数在一个单独的.h文件中进行原型化/声明)

2 个答案:

答案 0 :(得分:4)

主要问题是你返回一个指针Stack(本例中为s)的本地实例的指针,你还应该动态分配你要返回的实例: / p>

StackP newStack()
{
    StackP p = malloc(sizeof(struct Stack));

    p->top = -1;
    p->items = malloc(sizeof(ItemT) * DEFAULT_CAPACITY);
    p->size = DEFAULT_CAPACITY;

    return p;
}

答案 1 :(得分:2)

在newStack函数中,使用以下命令创建堆栈:

struct Stack s;
StackP p = &s;

不幸的是,只要例程返回,s指向堆栈的结构p就会消失。你真的应该这样做:

StackP p = malloc(sizeof(struct Stack));

然后在程序结束时,free(p);进行清理。

相关问题