指针之释放内存以及赋空

发布于 2020-07-24  742 次阅读


将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:迭代,双指针
代码如下:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *p=l1,*q=l2,*head;
    struct ListNode *temp=(struct ListNode*)malloc(sizeof(struct ListNode));
    head=temp;
    if(p==NULL||q==NULL){
        return p=NULL?q:p;
    }
    if(p==NULL&&q==NULL)return false;
    while(p&&q){
        if(p->val>=q->val){
            temp->next=q;//链接;
            temp=temp->next;//将temp移动到当前点位;
            q=q->next;//移动双指针;
        }
        else{
            temp->next=p;
            temp=temp->next;
            p=p->next;
        }
    }
    temp->next=(p==NULL?q:p);//链接剩下的元素;
    p=head->next;  
    free(head);//释放内存并野指针赋空;
    head=NULL;
    return p;
}
补充:释放内存后:

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空str = NULL;即本程序已经放弃再使用他。何谓“野指针”,在这里补充一下。
野指针是指程序员或操作者不能控制的指针。野指针不是NULL指针,而是指向“垃圾”的指针。
造成“野指针”的原因主要有
1.指针变量没有初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。在初始化的时候要么指向合法的指针,要么指向NULL。
2.指针变量被free或delete之后,没有设置为NULL。它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if
(p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。上文DEMO则是这种情况。
3.指针操作超越了变量的作用范围。
  注意其生命周期。


她喜欢所以就做咯