指针始化问题以及局部变量的返回问题

很久不碰指针了,然后刷leetcode21,出现了好几处与指针有关的错误,于是把正确的做法记录下来和错误导致可能出现的问题。

第一个问题:结构体里的指针定义后不初始化,然后应该是leetcode的编译器比较严格,就出现了错误。
`struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode PHead;
struct ListNode* NewListNode = &PHead;
struct ListNode* lista = list1;
struct ListNode* listb = list2;

while((NULL != lista) && (NULL != listb))
{
    if (lista->val <= listb->val)
    {
        NewListNode->next = lista;
        lista = lista->next;
        NewListNode = NewListNode->next;
    }
    else
    {
        NewListNode->next = listb;
        listb = listb->next;  
        NewListNode = NewListNode->next;          
    }
}

while(NULL != lista)
{
    NewListNode->next = lista;
    lista = lista->next;
    NewListNode = NewListNode->next;     
}

while(NULL != listb)
{
NewListNode->next = listb;
listb = listb->next;
NewListNode = NewListNode->next;
}

return PHead.next;

}`
改进是在Phead定义后写上这句PHead->next = NULL;。就可以了。
刚开始是认为自动局部变量指针的问题,后了解到函数结束调用前的流程是:保存返回值(给寄存器或者给哪个内存单元),清除变量(越晚进越早被清除),返回原先调用地址。我调用的PHead.next所指向的地址是list1或者list2的一部分,并没有在函数结束后就被清除,所以不是野指针问题。

第二个问题是:
我找bug时,因为不确定是不是局部变量的问题,所以malloc一块地址给PHead,后面出现no aligned的错误。然后也是在分配的结构体里的指针初始化 NULL后,就没出现问题了。

总的来说,还是代码规范问题。指针定义后,一定要先NULL,free和delete后,也要NULL
还有可能出现的一个问题,超出范围使用,例如

总结就是:
1:代码规范很重要,你的代码想要少出bug,在各平台的编译器中使用,就一定要注意代码规范。
2:指针定义后一定要立即初始化,free后一定要初始化。
3: 不要在超出指针使用范围的区域使用指针(否则编译器就可能不支持了)。

posted on 2024-02-21 16:10  我们的歌谣  阅读(2)  评论(0编辑  收藏  举报

导航