C 指针、结构和指针。。。创建堆栈时

C 指针、结构和指针。。。创建堆栈时,c,pointers,struct,stack,C,Pointers,Struct,Stack,因此,我想创建一个堆栈,如下所示: #include <stdio.h> #include <stdlib.h> typedef struct Node{ int data; struct node *link; }node; typedef struct Stack{ struct Node *topnode; int count; }stack; void push(int data, stack

因此,我想创建一个堆栈,如下所示:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
        int data;
        struct node *link;
}node;

typedef struct Stack{
        struct Node *topnode;
        int count;
}stack;

void push(int data, stack *ourstack){
    node newnode;
    newnode.data = data;
    ourstack.topnode = &newnode;
}

int main()
{
    stack mystack;
    push(1,mystack);
    printf("%d",(mystack.(*topnode).data));


}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*链接;
}节点;
typedef结构堆栈{
结构节点*topnode;
整数计数;
}堆叠;
无效推送(int数据,堆栈*ourstack){
节点newnode;
newnode.data=数据;
ourstack.topnode=&newnode;
}
int main()
{
堆叠mystack;
推(1,mystack);
printf(“%d”,(mystack.(*topnode.data));
}

但我确实会出错。我在这里有点困惑。在
push()
函数中,在最后一行中,我尝试了各种正确实现方法,但每次都失败了。现在,我的想法是,
ourstack
是指向
结构堆栈的指针。而
topnode
也是堆栈结构中指向另一个节点结构的指针。那么,
(*ourstack)。(*topnode)=newnode
ourstack.topnode=&newnode
是否应该工作?为什么?

方法中的变量,仅存在于堆栈中,退出方法后将不可用。由于您希望在调用
push
后保留它,因此需要分配一个节点,该节点具有类似
malloc
的函数,该函数将数据保存在堆中。在你不再需要它之后,你必须
释放它

方法中的变量,仅存在于堆栈中,退出方法后将不可用。由于您希望在调用
push
后保留它,因此需要分配一个节点,该节点具有类似
malloc
的函数,该函数将数据保存在堆中。在你不再需要它之后,你必须
释放它

两者都不起作用,因为
newnode
位于堆栈上,并且一旦代码退出
push
,它将不再存在。您需要动态地分配它

void push(int data, stack *ourstack){
    node *newnode;
    newnode = malloc(sizeof(*newnode));
    newnode->next = ourstack->topnode; // Point the next of the new node to the top node of the stack
    newnode->data = data;
    ourstack->topnode = newnode;
}
此外,您还需要在
main
中正确初始化
mystack
,否则您将面临未定义行为的风险,因为
topnode
可能是
NULL
或它可能具有随机值

stack mystack;
mystack.topnode = NULL;
mystack.count = 0;

这两种方法都不起作用,因为
newnode
位于堆栈上,并且一旦代码退出
push
,它将不再存在。您需要动态地分配它

void push(int data, stack *ourstack){
    node *newnode;
    newnode = malloc(sizeof(*newnode));
    newnode->next = ourstack->topnode; // Point the next of the new node to the top node of the stack
    newnode->data = data;
    ourstack->topnode = newnode;
}
此外,您还需要在
main
中正确初始化
mystack
,否则您将面临未定义行为的风险,因为
topnode
可能是
NULL
或它可能具有随机值

stack mystack;
mystack.topnode = NULL;
mystack.count = 0;

你的程序中有很多错误

  • ourstack
    结构
    类型的
    指针
    变量,当使用ourstack访问数据时,使用
    ->
    运算符而不是
    运算符

    替换

    ourstack.topnode = &newnode;
    

  • 推送函数
    定义
    和函数调用中存在冲突,您只需传递
    mystack
    并使用
    struct指针
    变量进行捕获。传递
    mystack
    地址
    ,您的函数调用应该是

    push(1,&mystack);
    
  • newnode
    是在
    push
    函数中声明的局部变量,无论您使用
    newnode
    尝试什么,它都将仅反映在此函数中,而不是在此函数之外。因此,为
    newnode
    动态分配内存并执行操作

    void push(int data, stack *ourstack){
        node *newnode;
        newnode = malloc(sizeof(stack));
        newnode->data = data;
        ourstack->topnode = newnode;
    }
    

编译成功后,使用gdb调试代码并进行分析。

程序中存在大量错误

  • ourstack
    结构
    类型的
    指针
    变量,当使用ourstack访问数据时,使用
    ->
    运算符而不是
    运算符

    替换

    ourstack.topnode = &newnode;
    

  • 推送函数
    定义
    和函数调用中存在冲突,您只需传递
    mystack
    并使用
    struct指针
    变量进行捕获。传递
    mystack
    地址
    ,您的函数调用应该是

    push(1,&mystack);
    
  • newnode
    是在
    push
    函数中声明的局部变量,无论您使用
    newnode
    尝试什么,它都将仅反映在此函数中,而不是在此函数之外。因此,为
    newnode
    动态分配内存并执行操作

    void push(int data, stack *ourstack){
        node *newnode;
        newnode = malloc(sizeof(stack));
        newnode->data = data;
        ourstack->topnode = newnode;
    }
    

编译后,使用
gdb
成功调试代码并进行分析。

“我确实有错误”-什么错误?在
ourstack.topnode=&newnode
@JohnZwinck
结构节点->
结构节点中请求成员“topnode”
ourstack.topnode
->
ourstack->topnode
push(1,mystack)->
推送(1,&mystack)
(mystack.(*topnode).data)
->
mystack.topnode->data
和其他一些问题。提示:打开C教科书,阅读有关动态内存分配和指针的章节。“我确实会出错”-什么错误?在
ourstack.topnode=&newnode
@JohnZwinck
struct Node
->
struct Node
ourstack.topnode
>
ourstack->topnode
push(1,mystack)中请求非结构或联合中的成员“topnode”->
推送(1,&mystack)
(mystack.(*topnode).data)
->
mystack.topnode->data
和其他一些问题。提示:打开你的C教科书,阅读有关动态内存分配和指针的章节。我明白了,应该是
推送(1,mystack)
?否-
mystack
声明为
stack
push
需要一个
stack*
-指向
stack
的指针,因此需要调用它
push(1,&mystack)
和打印值使用
mystack.topnode->data
对结构使用
,对指向结构的指针使用
->
。在这样的情况下,您不需要使用
*
&
,因为它会使代码无法读取。虽然它不是
结构节点
,但它是
结构节点