Open bosthhe1 opened 1 year ago
typedef struct Stack
{
STDataType _a;//结构体里面的指针
int _top;
int _capacity;
}Stack;
typedef struct {
Stack q1;//这里是指针q1指向结构体Stack;
Stack q2;
} MyQueue;
void StackInit(Stack ps)
{
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = 0;
}
MyQueue myQueueCreate() {
MyQueue obj = (MyQueue)malloc(sizeof(MyQueue));//创建了obj结构体指针,里面存放了q1和q2两个结构体指针,q1和q2指向的地址,暂时不知道
Stack tmp = (Stack)malloc(sizeof(Stack));//下面4行就是初始化结构体指针,因为结构体指针还嵌套了结构体指针,所以需要malloc空间来存放
Stack tmp1 = (Stack*)malloc(sizeof(Stack));
obj->q1 = tmp;
obj->q2 = tmp1;
tmp = NULL;
tmp1 = NULL;
StackInit(obj->q1);//完成最底层的初始化
StackInit(obj->q2);
return obj;
}
但是对于不为指针的,如果里面嵌套了一个其他结构体,初始化就不用malloc指针,因为对于指针,是指向的地址,但是对于一个结构体变量,里面就实实的存放了被嵌套的结构体变量的信息 typedef struct Stack { STDataType _a;//结构体里面的指针 int _top; int _capacity; }Stack; typedef struct { Stack q1;//这里是指针q1指向结构体Stack; Stack q2; } MyQueue; void StackInit(Stack ps) { ps->_a = NULL; ps->_capacity = 0; ps->_top = 0; } MyQueue myQueueCreate() { MyQueue obj = (MyQueue*)malloc(sizeof(MyQueue));//这里先创建一个结构体指针obj,结构体指针内部存放了两个零时变量,这两个零时变量中就直接存放了嵌套结构体的元素。 StackInit(&obj->q1); StackInit(&obj->q2); return obj; }
对于指针是需要初始化指向的,画线部分为p1的地址 但是对于非指针系统会直接分配地址 从这里就可以看出指针和非指针的区别
在以前我对于一些初始化一直不太会操作,怎么初始化,对于初始化的误解也很大,如在结构体中,嵌套另外的结构体指针,对于指针,我们要确保每一个指针都要初始化,当这个结构体指针为底层指针,指向数据的时候,我们就可以直接先指针制空,但是如果结构体指针中嵌套结构体指针,那么我们也需要将结构体里面嵌套的指针初始化,这时候我们就遇到了一个问题,是先初始化结构体指针外面的指针,还是先初始化结构体指针指向的指针,答案是先初始化结构体外面的指针,但是这个指针就不能指向空,不然指针指向的结构体内部的指针无法完成初始化,外面的指针就需要malloc一个节点,然后将指针指向这个节点,这个节点就是外面指针的初始化,然后再初始化里面的指针,将指针指向空,多个嵌套类型不变,只要不为底层结构都需要初始化。