gpt4 book ai didi

当我将数据推送到初始化堆栈时,C 链表不会改变

转载 作者:行者123 更新时间:2023-11-30 16:48:00 25 4
gpt4 key购买 nike

我正在尝试使用 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)

我之前用这种风格制作过结构,并且有一些函数只将它们作为参数并保留更改,但在这种情况下它们不会,我不知道为什么。

最佳答案

看起来您还没有将 s 标记为双指针。看起来您正在尝试插入链接列表的前面。您需要的是将引用的双指针传递到堆栈头部,以便更改存​​储在内存中的地址值。这样你就可以始终引用堆栈的顶部。

int
push_stack(stack_T **s, int data)
{
stack_T *new = malloc(sizeof(stack_T));
if (new == NULL)
return (1);
if (s == NULL)
{
free(new);
return (1);
}
new->value = data;
new->next = *s;
*s = new;
return 0;
}

我必须看看你的主函数是如何被调用的,这会导致段错误。但是,您似乎没有对堆栈顶部的正确引用。另外,我不太明白为什么你要为两个节点分配空间。 Malloc 返回一个由您指定的大小声明的指针。

你在这里写的内容:

stack_T new = malloc(sizeof(stack_T));
new = s;
if (s == NULL)
{
s = malloc(sizeof(stack_T));
if (s == NULL)
return 1;
}

永远不会遇到 NULL 是一种 void 指针类型,而您分配的 s 不是指针类型,因此当 malloc 返回 8 字节指针时,您试图存储 12 字节变量。

还有一个提示是,您可以使用 gcc -g 进行编译,并使用 valgrind 来确定发生段错误的行

关于当我将数据推送到初始化堆栈时,C 链表不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com