【发布时间】:2017-03-31 16:43:16
【问题描述】:
我正在尝试使用 C 中的链表来实现堆栈,但是每当我在将新值压入堆栈后尝试调用该值时,都会出现段错误。我知道这种情况正在发生,因为即使我添加了堆栈,程序仍然说堆栈为空。由于某种原因,我在推送中所做的更改在函数终止时不会保留,我无法弄清楚原因。
这是我的堆栈结构、初始化和推送代码:
typedef struct stack
{
int value;
struct stack * next;
} * stack_T;
stack_T
new_stack()
{
return NULL;
}
int
push_stack(stack_T s, int data)
{
stack_T new = malloc(sizeof(stack_T));
new = s;
if (s == NULL)
{
s = malloc(sizeof(stack_T));
if (s == NULL)
return 1;
}
s->value = data;
s->next = new;
return 0;
}
编辑:感谢您的帮助,但我忘了提及必须使用这些参数来完成推送,这是分配的一部分。我不是在寻找如何去做,而是在寻找我做错了什么。我知道我可以通过引用来模拟传递,但正如我所说,它必须是:
int push_stack(stack_T s, int data)
我以前用这种风格制作过结构,并且有函数将它们作为参数并保留更改,但在这种情况下它们不会,我不知道为什么。
【问题讨论】:
-
您通常不应该创建指针的类型别名,例如
stack_T。这是因为malloc(sizeof(stack_T))为指针分配了足够的空间,而不是结构。 -
您还应该花一些时间搜索和阅读有关在 c 中通过引用模拟调用。
-
您还 malloc 一个堆栈,但随后覆盖下一行中的唯一引用....您应该画出什么指向什么的图片,然后遍历您的代码...有一堆错误...
-
我建议避免使用“new”作为变量名。它在 C 中是合法的,但在 C++ 中是保留字,以后可能会给您带来麻烦。
-
与问题更相关,我建议您为类型、函数和函数实现编写 documentation(即在 cmets 中)。这些应该足以证明(在非正式意义上)您的代码是正确的。由于您的代码实际上是错误的,因此这个过程不仅应该帮助您发现问题所在,而且应该清楚如何改正。
标签: c struct linked-list stack push