C中堆栈操作中的指针变量与全局变量

C中堆栈操作中的指针变量与全局变量,c,pointers,stack,global-variables,dynamic-allocation,C,Pointers,Stack,Global Variables,Dynamic Allocation,这是一个通过链表执行堆栈操作的简单程序。这是一种形式化的方法。我理解指示堆栈顶部和指向下一个节点的指针所需的指针的概念。但是在这种情况下,是否有必要将结构变量的指针变量设为struct student变量,即typedef to student。I宣布为学生*(任何姓名);。然后通过malloc动态分配内存;它的用途是填充信息,然后推送到堆栈。那么使用全局变量或指针的区别和优缺点是什么呢 关于这个程序,我自己写的,它运行得很好 typedef struct student{ int ro

这是一个通过链表执行堆栈操作的简单程序。这是一种形式化的方法。我理解指示堆栈顶部和指向下一个节点的指针所需的指针的概念。但是在这种情况下,是否有必要将结构变量的指针变量设为struct student变量,即typedef to student。I宣布为学生*(任何姓名);。然后通过malloc动态分配内存;它的用途是填充信息,然后推送到堆栈。那么使用全局变量或指针的区别和优缺点是什么呢

关于这个程序,我自己写的,它运行得很好

typedef struct student{
    int roll;
    char name[30];
    struct student *next;

}Student;

typedef struct stack{
Student *top;

}Stack;

Student *makestudent(int r,char n[]){
Student *newstudent;
if((newstudent=(Student *)malloc(sizeof(Student)))==NULL){
    printf("Out Of Memory");
 }
 else{
newstudent->roll=r;
strcpy(newstudent->name,n);
newstudent->next=NULL;
}

return newstudent;

 }


void push(int r,char n[],Stack *s){
Student *student=makestudent(r,n);
student->next=s->top;
s->top=student;
}

Student *pop(Stack *s){

Student *st=s->top;
s->top=s->top->next;
return st;

}

下面是一些使用静态数组后进先出堆栈而不使用指针的代码。主要的问题是你必须猜测这个堆栈有多大。如果您想在它变得太大时重新分配,那么您可以重新使用指针

#include <stdio.h>
#include <string.h>
#define MAXS    10          // stack size

typedef struct {
    int roll;
    char name[30];
} student;    

student studs [MAXS];
int stacktop = 0;

int push(student *s) {
    if (stacktop >= MAXS)
        return 1;           //mega fail
    studs [stacktop++] = *s;
    return 0;
}

int pop(student *s) {
    if (stacktop <= 0)
        return 1;           //mega fail
    *s = studs [--stacktop];
    return 0;
}

int main(void) {
    student entryput = {42, "Arthur Dent"};
    student entryget;
    if (push (&entryput))
        return 1;           // need to handle better than this

    if (pop (&entryget))
        return 1;           // need to handle better than this
    printf ("Name: %s, Roll: %d\n", entryget.name, entryget.roll);
    return 0;
}

可重入性,这意味着线程安全。“我可以使用一个全局变量作为Student(anyname);使用的是填充信息,然后推送到堆栈中。”但是您需要将
push()
结构的副本推送到堆栈中,这仍然需要为它分配内存。或者,您可以使用固定大小的
struct student
静态数组,然后
push()
pop()
函数将使用堆栈索引而不是链表。顺便说一句,
pop()
中有一个错误-它没有
free()
push()
中分配的内存。它显然需要在编译时分配内存。指针变量在运行时分配内存。而且这个程序也可以不用动态内存分配,我认为这比处理指针要容易得多;请理解我先前的话。将数据输入到静态
struct
以便可以“堆叠”它之后,下一条记录将覆盖静态
struct
。因此,您仍然需要在运行时分配内存,并将
struct
复制到它-除非如我所说,堆栈是一个静态数组而不是链表,在这种情况下,您可以直接将数据输入下一个数组元素,并增加数组指针。所以我编写的程序是在链接堆栈上操作的唯一方法?@immibis这不是你的问题,但这里有一个不使用内存指针的答案。这并不令人满意,因为指针在C语言中是不可避免的,这也是该语言强大的原因之一。
Name: Arthur Dent, Roll: 42