bosthhe1 / -

数据结构与算法(初阶)
0 stars 0 forks source link

对于初始化的自我错误认识 #20

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

在以前我对于一些初始化一直不太会操作,怎么初始化,对于初始化的误解也很大,如在结构体中,嵌套另外的结构体指针,对于指针,我们要确保每一个指针都要初始化,当这个结构体指针为底层指针,指向数据的时候,我们就可以直接先指针制空,但是如果结构体指针中嵌套结构体指针,那么我们也需要将结构体里面嵌套的指针初始化,这时候我们就遇到了一个问题,是先初始化结构体指针外面的指针,还是先初始化结构体指针指向的指针,答案是先初始化结构体外面的指针,但是这个指针就不能指向空,不然指针指向的结构体内部的指针无法完成初始化,外面的指针就需要malloc一个节点,然后将指针指向这个节点,这个节点就是外面指针的初始化,然后再初始化里面的指针,将指针指向空,多个嵌套类型不变,只要不为底层结构都需要初始化。

bosthhe1 commented 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; }

bosthhe1 commented 1 year ago

但是对于不为指针的,如果里面嵌套了一个其他结构体,初始化就不用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; }

bosthhe1 commented 1 year ago

对于指针是需要初始化指向的,画线部分为p1的地址 image 但是对于非指针系统会直接分配地址 image 从这里就可以看出指针和非指针的区别