初始化顺序栈时 (SeqStack *)malloc(sizeof(SeqStack))中的 (SeqStack *)为什么要再定义一遍类型?

代码:
typedef struct
{
ElemType data[MAX_SIZE];
int top; //栈顶指针
}SeqStack; //声明顺序栈类型

/*----------------------初始化顺序栈------------------------*/
static void init_stack(SeqStack *&s) // 指针的引用
{
    s = (SeqStack *)malloc(sizeof(SeqStack));
    s->top = -1;
}
问题如题,在 init_stack(SeqStack *&s) 就定义了一遍该指针,到下面又用相同的写法定义了一遍,为什么?直接分配内存不行吗,话说指针为什么需要那么大的内存a,而且为什么指针里面能有个top变量?

目标源代码在:https://blog.csdn.net/xiezhi123456/article/details/86487748的初始化顺序栈下面。

在 init_stack(SeqStack *&s)内只是为你传入的结构体指针分配内存空间,并非是定义;
可以在main函数里直接分配内存空间,但别人这样写,思路和代码结构层次分明,便于理解;
指针需要这么大空间是因为结构体里有一个整形 数组成员;

并非是指针里有个top变量,是指针指向的结构体内定义了一个top成员;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-04-09
参数类型:SeqStack *, 是SeqStack结构的指针。
参数:&s, 是对外部指针的引用。
调用返回:为指针s分配了 MAX_SIZE + size(int)的空间,同时指向该空间。空间包含的top初始化为0xffffffff(假设int长度4字节)。
第2个回答  2021-04-09
malloc用于在堆上申请所需的内存,其返回类型是一个指向所需内存的void指针。我们需要把这个无意义的void类型转换成实际在用的类型。在本例中,我们申请的内存实际上就是一个SeqStack结构,所以void指针就当转成指向的SeqStack的指针。
你混淆了“指针”和“指针指向的对象”这两个概念,建议把指针的知识再看一看,这也说明你很少写代码,其实上机所能悟到的远比看十遍书来得深刻本回答被提问者采纳
第3个回答  2021-04-10
第二个不是定义,理解为转换,将分配的地址转换为SeqStack
相似回答