我试图使用指针来动态分配这个结构的数据。
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文件中进行原型化/声明)
答案 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);
进行清理。