我认为这不是很难,但我看不出自己的错。 我有一个链接列表,我想初始化。 有两件事需要考虑:
需要使用附加功能 create
初始化(设置全局指针= NULL)struct StackElement {
int digit;
StackElement *predecessor;
};
StackElement *stack;
void create (StackElement *anyStack) {
anyStack->predecessor = NULL;
}
int main () {
create(stack);
return 0;
}
不幸的是,运行程序导致:
分段错误(核心转储)
我认为错误必须在函数 create - 任何想法?
非常感谢 - 大脑停止思考......
通过编辑 create :
功能解决了问题void create (StackElement *anyStack)
anyStack = new StackElement;
anyStack->predeccesor = NULL;
}
答案 0 :(得分:0)
您应该在main函数中创建对象,然后将其地址传递给“create”函数。
喜欢:
int main () {
StackElement se;
create(&se);
return 0;
}
答案 1 :(得分:0)
您忘了创建实际的堆栈对象。也许试试这个:
StackElement the_stack;
StackElement *stack = &the_stack;
int main()
{
// ...
}
答案 2 :(得分:0)
您的*stack
是指向尚未初始化的内存的指针。当您调用create(stack)
时,函数create
会尝试修改stack
指向的内存,但您不拥有此内存(因为谁知道*stack
指向的内存)。
您需要执行stack = new StackElement
或stack = malloc(...)
之类的操作,但即便如此,我认为create
不会做您想要的事情:特别是{{1}的价值}将不会被设置,并且您的“堆栈”将在其中包含未定义值的元素。所以我认为还有其他问题。
答案 3 :(得分:0)
全局变量'stack'已初始化为零或一些随机值。您必须在使用之前设置引用或检查它是否为零。
struct StackElement {
int digit;
StackElement *predecessor;
};
StackElement *stack = 0;
void push(StackElement *anyStack) {
anyStack->predecessor = stack;
stack = anyStack;
}
StackElement* pop() {
StackElement *ret;
ret = stack;
if (stack) {
stack = stack->predecessor;
}
return ret;
}