关于栈初始化的二级指针使用问题
先附上代码
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 20
typedef struct bitnode{
char zt;
struct bitnode *lchild;
struct bitnode *rchild;
}Bitnode,*bitree;
typedef struct{//栈结构定义
bitree *base;
bitree *top;
int stacksize;
}SqStack;
int InitStack(SqStack *S){
//构造一个空栈S
S->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree));
if(!S->base)//分配失败
{
printf("分配内存失败.\n");
exit(0);
}
(S->base[0])=malloc(sizeof(Bitnode));
S->base[0]->zt=10;
printf("%d\n",(S->base[0])->zt);
//S->top=S->base;
//S->stacksize=STACK_INIT_SIZE;
return 1;
}
int main()
{
SqStack *t=malloc(sizeof(SqStack));
InitStack(t);
return 0;
}
先附上初始化栈的C语言测试代码。
首先根据SqStack *t=malloc(sizeof(SqStack));
这一句代码,创建了一个SqStack结构体类型的指针并为其开辟空间(初始化)
见图1。
由上图可知,t是一个SqStack类型的指针,它指向了一个SqStack结构体a。
结构体a里面存放了一个二级指针base和一个二级指针top。
bitree *base;
bitree *top;
bitree定义的是一个指向bitnode类型的指针,而bitree *base即为二级指针。
S->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree));
由上面的代码可以知道,此句代码为base开辟了20个bitree类型的空间。
没加下面这句代码的时候
(S->base[0])=malloc(sizeof(Bitnode));
我用下面这一行代码进行访问发现总是出现段错误的问题,因此使我发现了虽然为一级指针数组开辟了空间,但其中存放的是指针,而指针去指向一个节点仍需要为其开辟空间。这一个问题是我在应用中经常会忽视的。
(S->base[0])->zt=10;
在加入(S->base[0])=malloc(sizeof(Bitnode));这句代码之后,空间分配见下图
这时候我们可以通过指针数组中的一级指针对bitnode节点进行访问。